home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 2003 June / macformat-130.iso / mac / Reviewed⁄Demos / Spearhead Demo / demota / pak1.pk3 / global / friendly.scr < prev    next >
Encoding:
Text File  |  2002-10-21  |  78.8 KB  |  2,898 lines

  1. //    Friendly system created by Mackey McCandlish.
  2. //    
  3. //    Before level waittill spawn "exec global/friendly.scr".
  4. //    
  5. //    To setup a friendly give a (preferrably American) AI targetname "friendly".
  6. //    
  7. //    You can set his #fnum to be 1 through 10. In the scripting system you can access him as level.friendly# (# being whatever 
  8. //    fnum you set).
  9. //    
  10. //    You can make a friendly stop avoiding the player by setting his .avoidplayer to 0. You can turn it back on by setting
  11. //    his .avoidplayer to 1.
  12. //    
  13. //    When you want to turn on the friendly AI, do "level.friendly# thread global/friendly.scr::friendlythink".
  14. //    Afterwards you can set his friendtype like this: level.friendly#.friendtype = 1.
  15. //    
  16. //    The default friendtype is 0. Friendtypes actually used in MOH are:
  17. //    
  18. //    0    Offset Behavior:
  19. //
  20. //            The AI follows/leads the player at an offset from his current position (used in m1l1, m4l0, m5l1a, and m5l1b).
  21. //
  22. //        Give the nodes you want the friendlies to potentially stop at a targetname of "friendlynode".
  23. //
  24. //        Give the nodes a #set value ranging from 10 up to however high you go. You start with 10 at the beginning of the level
  25. //        and then go up by 10s as you go through the level. So a "friendlynode" at the beginning of the level would be #set 10
  26. //        and a node at the end of the level might have #set 600, whereas a node in the middle (in this case) would be roughly
  27. //        #set 300. Multiple nodes can have the same #set value and you can use finer values like 15 or 11 or whatnot where you
  28. //        need to.
  29. //        
  30. //        It helps to use $targetname instead of targetname so that the targetname is not changed every time you copy and paste 
  31. //        a node. To further differentiate the nodes, press K and change their editor color for the 3d view.
  32. //
  33. //        You can also give groups of nodes a identical #area value (like #area 1 for example). When the AI feels like going to
  34. //        a node with a .area of a given value, he will not go to any node that doesn't have that .area value until all the
  35. //        enemies with targetname "enemy" and the same #area value (including enemies from enemyspawners that have the same #area
  36. //        value) are dead. Then he will turn off those nodes forever and the AI will not try to go back to those nodes. Such
  37. //        nodes obviously must be placed in the same general area, like in a singular building, so the AI can run in and clear
  38. //        out the building then run out.
  39. //
  40. //        To determine where a friendly will follow in relation to the player, set his .mins and .maxs. For example to make a
  41. //        friendly lead the player, like in m1l1, set his .mins to 20 and .maxs to 40. To make a friendly follow the player, like
  42. //        m5l1a and m5l1b, set the mins to -40 and maxs to -20. Don't set the mins higher than the maxs.
  43. //
  44. //        You can further tweak the friendly with .distance and .waittime (they determine how close he has to get to nodes before
  45. //        he goes for his next node and how long he waits at each node before following the player).
  46. //
  47. //
  48. //    1    Barney Behavior (ahem).
  49. //    
  50. //            The AI follows the player at a distance (used in the majority of levels with friendlies aside from m1l1, m5l1a, 
  51. //            and m5l1b). By default he'll follow the player, but you can make him follow other friendlies by setting his
  52. //            .destination to be the friendly of choice.
  53. //
  54. //        You can alter how close the friendly follows with .distance and how long he waits with .waittime.
  55. //
  56. //    4    Leader Behavior.
  57. //
  58. //        Leader Behavior is very special case and was created exclusively for m1l2a (the SAS Agent). Basically he uses the same
  59. //        friendlynode/#set system as Offset Behavior friendlies, but he stays slightly ahead of the player and fills in the nodes
  60. //        one by one as he moves through the map (filling them in sequentially). Therefore nodes can not have the same #set and
  61. //        there is no .mins or .maxs.
  62. //
  63. //        Friendlynodes for Leader Behavior can have a #flag value as well, like #flag 0. When the friendly gets to that node, he
  64. //        will enable friendly avoid and then execute a thread called "flagthread0" in the current level.script. 
  65. //
  66. //        Anybody trying to setup such a friendly would have to spend a lot of time getting to know m1l2a.scr.
  67. //
  68. //    5    Medic Behavior.
  69. //        
  70. //            The AI follows the player and friendlies around like a Barney guy (with preference for friendlies over the player)
  71. //            and will heal them if they're wounded sufficiently. He'll also heal himself a few times (limited). Occurs in m5l1b
  72. //            and m4l0.
  73. //
  74. //        You don't have to do anything special with medics, but its nice to make sure they have a medic model. You can set their
  75. //        .distance to control how close they follow.
  76. //
  77. //    All the other friendly types are unsupported and just didn't turn out to be needed in the game. You should use friendtype
  78. //    -1 when you want an AI to not do any special friendly AI and then do a wait 1 after setting friendtype -1 to make sure it
  79. //    is active before you issue and new commands.
  80.  
  81. //    06/14/2002 (jsl) - Added new function to stop friendly...
  82. //            do level.friendly# thread global/friendly.scr::friendlystop
  83. //
  84. //
  85.  
  86. main:
  87.     $player.entref = -1
  88.     level.friendly_auto_arrange    = 1
  89.     waitthread friendlygen
  90. end
  91.  
  92. soondie:
  93.     level waittill spawn
  94.     wait 4
  95.     while (isalive self)
  96.     {
  97.         self damage $world 15000 $world (0 0 0) (0 0 0) (0 0 0) 0 9 0 0
  98.         wait 1
  99.     }
  100. end
  101.  
  102.  
  103. debug:
  104.     level.frienddebug = 1
  105. end
  106.  
  107. //-----------------------------------------------------
  108. friendlystop:
  109. //
  110. //    After you've called friendlythink, you can call this to 
  111. //    get rid of the friendly behaviour...
  112. //
  113. //-----------------------------------------------------
  114.     
  115.     /*
  116.     if ( self.friendlythink_thread!=NULL && self.friendlythink_thread != NIL )
  117.         self.friendlythink_thread delete
  118.  
  119.     if ( self.friendlythinkstart_thread!=NULL && self.friendlythinkstart_thread != NIL)
  120.         self.friendlythinkstart_thread delete
  121.  
  122.     self.friendlythink_thread = NULL
  123.     self.friendlythinkstart_thread = NULL
  124.     */
  125.  
  126.     self.friendly_stopped    = 1
  127.  
  128.     End
  129.  
  130.  
  131. friendlythink:
  132.  
  133.     if ( self.friendlythink_thread==NIL || self.friendlythink_thread==NULL )
  134.     {
  135.         self.friendlythink_thread = NULL
  136.         self.friendlythinkstart_thread = NULL
  137.  
  138.         self.friendlythink_thread = local
  139.         self.friendly_stopped = 0
  140.  
  141.         thread friendlythinkstart
  142.  
  143.         self.friendlythinkstart_thread = parm.previousthread
  144.         
  145.         self waittill death
  146.  
  147.         if (self.friendlythinkstart_thread!=NULL)
  148.         {
  149.             self.friendlythinkstart_thread delete
  150.         }
  151.  
  152.         self.friendlythink_thread = NULL
  153.         self.friendlythinkstart_thread = NULL
  154.     }
  155.     else
  156.     {
  157.         if ( self.friendly_stopped==1 )
  158.         {
  159.             self.friendly_stopped = 0
  160.             if ( self.friendtype<0 )
  161.             {
  162.                 self.friendtype = 1
  163.             }
  164.         }
  165. //        else
  166. //        {
  167. //            println "trying to friendlythink while already friendlythinking! name=" self.targetname
  168. //        }
  169.     }
  170.  
  171. end
  172.  
  173.  
  174. forceactiveatime:
  175.     while (isalive self)
  176.     {
  177.         self forceactivate
  178.         wait 50
  179.     }
  180. end
  181.  
  182. friendlyhealth:
  183.     while (isalive self)
  184.     {
  185.         local.health = self.health
  186.         self waittill pain
  187.         print3d (self.origin + (0 0 70)) 2 (local.health - self.health)
  188.         local.health = self.health
  189.     }
  190. end
  191.  
  192. healthcheck:
  193.     while (isalive self)
  194.     {
  195.         /*
  196.             if ($health)
  197.             println ("health " + $health.size + " health_pickup " + self.health_pickup + " friendtype " + self.friendtype)
  198.             else
  199.             println "no health"
  200.         */
  201.         
  202.         if ((self.health_pickup == TRUE) && ($health))
  203.         {
  204.         if (self.friendly_stopped==0)
  205.         {
  206.         if ((self.thinkstate != "attack") && ((self.friendtype == 1) || (self.friendtype == 0)))
  207.         {
  208.             if (self.health / self.maxhealth < (self.health_amount * 0.01))
  209.             {
  210. //                if (self.fnum)
  211. //                    println ("1fnum is " + self.fnum + " and friendtype is " + self.friendtype)
  212. //                else
  213. //                    println ("1no fnum and friendtype is " + self.friendtype)
  214.  
  215.                 local.oldfriendtype = self.friendtype
  216.                 local.range = 1200
  217.                 local.ent = -1
  218.                 for (local.i=1;local.i<$health.size+1;local.i++)
  219.                 {
  220.                     local.newrange = vector_length (self.origin - $health[local.i].origin)
  221.                     if (local.newrange < local.range)
  222.                     {
  223.                         local.ent = local.i
  224.                         local.range = local.newrange
  225.                     }
  226.                 }
  227.  
  228.                 if (local.ent != -1)
  229.                 {
  230.                     self.friendtype = -2
  231.                     if ($health[local.ent].target)
  232.                         local.walktarget = $($health[local.ent].target)
  233.                     else
  234.                         local.walktarget = $health[local.ent]
  235.  
  236.                     local.healthitem = $health[local.ent]
  237.  
  238.                     local.break = 0
  239.                     while (local.break == 0)
  240.                     {
  241.                         self.movedoneradius = 50
  242.                         self runto local.walktarget
  243.                         self waittill movedone
  244.  
  245.                         if (parm.movefail == 1)
  246.                             local.healthitem.targetname = "health_cantreach"
  247.  
  248.                         if ((parm.movefail == 1) || (self.friendtype != -2) || (local.healthitem == NULL) || (self.thinkstate == "attack"))
  249.                             local.break = 1
  250.                         else
  251.                         if (vector_length (self.origin - local.walktarget.origin) < 80)
  252.                             local.break = 2
  253.                     }
  254.  
  255.                     if (local.break == 2)
  256.                     {
  257.                         local.org = self.origin
  258.                         local.horg = local.healthitem.origin
  259.                         if ((local.org[2] - 10 < local.horg[2]) && (local.org[2] + 20 > local.horg[2]))
  260.                             local.sit = TRUE
  261.                         else
  262.                             local.sit = FALSE
  263.  
  264.                         if (local.sit == TRUE)
  265.                             self exec global/crouch.scr // was stand
  266.  
  267.                         println ("Grabbed health, my origin " + self.origin + " health origin " + local.healthitem.origin)
  268.                         self turnto local.healthitem
  269.                         wait 0.5
  270.                         self upperanim pickup_obj
  271.                         wait 0.33
  272.                         if (local.healthitem != NULL)
  273.                         {
  274.                             local.healthitem delete
  275.                             if (local.healthitem.amount > 25 ) 
  276.                                 self playsound med_kit
  277.                             else
  278.                                 self playsound med_canteen
  279.     
  280.                             self heal (local.healthitem.amount * 0.02)
  281.                             println ("Friendly got health " + local.healthitem.amount)
  282.                             wait 0.3
  283.             
  284.                             if (local.sit == TRUE)
  285.                                 self exec global/stand.scr // was stand
  286.                         }
  287.                     }
  288.                     if (self.fnum)
  289.                         println ("2fnum is " + self.fnum + " and friendtype is " + self.friendtype)
  290.                     else
  291.                         println ("2no fnum and friendtype is " + self.friendtype)
  292.                     println ("made friendtype be " + local.oldfriendtype)
  293.                     self.friendtype = local.oldfriendtype
  294.                     wait 2
  295.                 }
  296.             }
  297.         }
  298.         }
  299.         }
  300.         wait 1
  301.     }
  302. end
  303.  
  304. friendlythinkstart:
  305.  
  306.     if (level.frienddebug == NIL)
  307.     println (self + " did friendlythink")
  308.  
  309.         level.entref++
  310.         self.entref = "friendly" + level.entref
  311.  
  312.         if (self.lookat_time == NIL)
  313.             self.lookat_time = 1
  314.  
  315.         if (self.look == NIL)
  316.             self.look = 1
  317.  
  318.         if (self.area == NIL)
  319.             self.area = -1
  320.  
  321.         if (self.mins == NIL)
  322.             self.mins = -20
  323.  
  324.         if (self.maxs == NIL)
  325.             self.maxs = 20
  326.  
  327.         if (self.friendtype == NIL)
  328.             self.friendtype = 0
  329.  
  330.  
  331.         if (self.distance == NIL)
  332.             self.distance = 250
  333.  
  334.         if ((self.destination == NIL) || !(self.destination))
  335.         {
  336.             if (level.friendlynodes < 1)
  337.                 self.destination = $player
  338.             else
  339.             if (self.friendtype == 0)
  340.             {
  341.                 for (local.i=1;local.i<level.friendlynodes+1;local.i++)
  342.                 {
  343.                     if (level.friendlyused[local.i] == 0)
  344.                     {
  345.                         self.destination = level.friendlynode[local.i]
  346.                         level.friendlyused[local.i] = 1
  347.                         local.i = level.friendlynodes + 5
  348.                     }
  349.                 }
  350.             }
  351.             else 
  352.                 self.destination = $player
  353.         }
  354.  
  355.         if (getcvar(debug) == "1")
  356.             println ("destination is " + self.destination + " and friendtype is " + self.friendtype)
  357.  
  358.  
  359.         if (self.friendlyrepulsetest)
  360.             thread friendlyrepulse
  361.  
  362.         if (self.destinationset == NIL)
  363.             self.destinationset = 10
  364.  
  365.         if (self.destinationnum == NIL)
  366.             self.destinationnum = 10
  367.  
  368.         if (self.maxhealth == NIL)
  369.             self.maxhealth = self.health
  370.  
  371.         if (self.waittime == NIL)
  372.             self.waittime = 0.2
  373.  
  374.         if (self.health_amount == NIL)
  375.             self.health_amount = 90
  376.  
  377.         if (self.friendtype == 5)
  378.         {
  379.             self gun "none"
  380.             self exec global/disable_ai.scr
  381.  
  382.             if (self.lasthealed == NIL)
  383.                 self.lasthealed = level.time + 1
  384.  
  385.             if (self.playerhealed == NIL)
  386.                 self.playerhealed = level.time + 1
  387.  
  388.             self.mins = -15
  389.             self.maxs = 5
  390.         }
  391.  
  392. //        if (getcvar(debug) == "1")
  393. //            thread friendlyhealth
  394.  
  395.         self.originaldestination = self.destination
  396.  
  397. //    self type_attack "cover"
  398. //    self.health = 5000
  399. //    self ammo_grenade 4
  400.  
  401.         self.lastdestination = $player // was -1
  402.         local.standtime = level.time
  403.         local.runtime = level.time
  404.         local.friendrange = 50
  405.         local.stand = 0
  406.         thread forceactiveatime
  407.  
  408.         local.lastplayerset = -1
  409.     self.health_pickup = TRUE
  410.     thread healthcheck
  411.     while (isalive self)
  412.     {
  413.         if (self.thinkstate != "attack" )
  414.         {
  415.     //        println (self.entref + "'s attackstate is " + self.thinkstate)
  416.     //            println self.health
  417.     //            println $player.health
  418. //                wait 1 //frame
  419.                 waitframe
  420.     //            println self.friendtype
  421.  
  422.             if (self.friendtype == -1 || self.friendly_stopped==1)
  423.             {
  424.                         if (self.waittime == -1)
  425.                             waitframe
  426.                         else
  427.                             wait self.waittime
  428.             }
  429.             else
  430.             if (self.friendtype == 2)
  431.             {
  432.  
  433.                 /*
  434.                 local.range = vector_length ($player.origin - self.origin)
  435.         
  436.                 local.break = 0
  437.  
  438.                 for (local.i=1;local.i<level.friendlynodes+1;local.i++)
  439.                 {
  440.                     local.radius = vector_length (level.friendlynode[local.i].origin - $player.origin)
  441.                     if ((local.radius < local.range) && (level.friendlyused[local.i] == 0))
  442.                     {
  443.                         local.break = 1
  444.                         local.seeknum = local.i
  445.                     }
  446.  
  447.                     waitframe
  448.                 }
  449.                 */
  450.  
  451.                 
  452. //                if ((local.break == 1) && (level.friendlyused[local.seeknum] == 0))
  453.         
  454.                 for (local.i = level.playernodenum;local.i<level.friendlynodes+1;local.i++)
  455.                 if (level.friendlyused[local.i] == 0)
  456.                 {
  457.                     self.olddestinationnum = self.destinationnum
  458.                     self.destination = level.friendlynode[local.i]
  459.                     self.destinationset = level.friendlynode[local.i].set
  460.                     self.destinationnum = local.i
  461.  
  462.                     if (level.frienddebug == 1)
  463.                         println ("best choice was " + (vector_length($player.origin - level.friendlynode[local.i].origin)) + " away from player")
  464.  
  465.                     local.i = level.friendlynodes + 5
  466.                 }
  467.  
  468.                     thread friendlyused self.destinationnum
  469.  
  470.                 if (self.destination != self.lastdestination)
  471.                 {
  472.  
  473.                     self thread ailookrun
  474.                     self runto self.destination
  475.  
  476.                 if (level.frienddebug == 1)
  477.                     println (self + " is running to " + self.destinationnum)
  478.  
  479.                     wait 1
  480.  
  481.                     if (level.friendlyused[self.olddestinationnum] == 1)
  482.                         level.friendlyused[self.olddestinationnum] = 0
  483.  
  484.                     self waittill movedone
  485. //                    wait (1 + randomfloat(2))
  486. //                    self.lookthread delete
  487.  
  488.                 }
  489.  
  490.                 self.lastdestination = self.destination
  491.             }
  492.             else
  493.             if (self.friendtype == 8)
  494.             {
  495.         
  496.                 for (local.i = level.playernodenum;local.i<level.friendlynodes+1;local.i++)
  497.                 if ((level.friendlyused[local.i] == 0) && (level.friendlynode[local.i].set > self.destinationset))
  498.                 {
  499.                     self.olddestinationnum = self.destinationnum
  500.                     self.destination = level.friendlynode[local.i]
  501.                     self.destinationset = level.friendlynode[local.i].set
  502.                     self.destinationnum = local.i
  503.  
  504.                     if (level.frienddebug == 1)
  505.                         println ("best choice was " + (vector_length($player.origin - level.friendlynode[local.i].origin)) + " away from player")
  506.  
  507.                     local.i = level.friendlynodes + 5
  508.                 }
  509.  
  510.                     thread friendlyused self.destinationnum
  511.  
  512.                 if (self.destination != self.lastdestination)
  513.                 {
  514.  
  515.                     self thread ailookrun
  516.                     self runto self.destination
  517.  
  518.                 if (level.frienddebug == 1)
  519.                     println (self + " is running to " + self.destinationnum)
  520.  
  521.                     wait 1
  522.  
  523.                     if (level.friendlyused[self.olddestinationnum] == 1)
  524.                         level.friendlyused[self.olddestinationnum] = 0
  525.  
  526.                     self waittill movedone
  527. //                    wait (1 + randomfloat(2))
  528. //                    self.lookthread delete
  529.  
  530.                 }
  531.  
  532.                 self.lastdestination = self.destination
  533.             }
  534.             else
  535.             if (self.friendtype == 1)
  536.             {
  537.                 // auto-arrange the guys to have them follow each other...
  538.                 if ( level.friendly_auto_arrange==1 )
  539.                 {
  540.                     if (!(isalive self.destination) || !(self.destination))
  541.                     {
  542.                         if !(isalive self.destination)
  543.                             println ("1made destination player, destination was " + self.destination)
  544.  
  545.                         if !(self.destination)
  546.                             println "3made destination player"
  547.  
  548.                         self.destination = $player
  549.                         self.originaldestination = $player
  550.                     }
  551.  
  552.                     self.destination = self.originaldestination
  553.  
  554.                     for (local.i=1;local.i<level.friendlys+1;local.i++)
  555.                     {
  556.                         if (isalive level.friendly[local.i])
  557.                         {
  558.                             if ((level.friendly[local.i].friendtype == 1) && (level.friendly[local.i].destination == self.destination) && (self != level.friendly[local.i]))
  559.                             {
  560.                                 if (((self.origin - self.destination.origin) * (self.origin - self.destination.origin)) >
  561.                                 ((level.friendly[local.i].origin - self.destination.origin) * (level.friendly[local.i].origin - self.destination.origin)))
  562.                                     self.destination = level.friendly[local.i]
  563.                                 else
  564.                                     level.friendly[local.i].destination = self 
  565.                             }
  566.                         }
  567.                     }
  568.                 }
  569.  
  570.                 local.movethread = -1
  571.  
  572.                 if (vector_length (self.destination.origin - self.origin) > self.distance + local.friendrange) 
  573.                 {
  574.                     local.rangecheck = vector_length (self.destination.origin - self.origin)
  575. //                    println ("1distance to dest is " + local.rangecheck)
  576.                     self.movedoneradius = self.distance // + local.friendrange
  577.                     self runto self.destination // .origin
  578.                     local.stand = 0
  579.                     self waittill movedone
  580.                     local.rangecheck = vector_length (self.destination.origin - self.origin)
  581. //                    println ("2distance to dest is " + local.rangecheck)
  582.  
  583.                     if !(self.destination)
  584.                     {
  585.                         self.destination = $player
  586.                         println "2made destination player"
  587.                     }
  588.  
  589.                     if (getcvar(debug) == "1")
  590.                         println "Ending the run"
  591.                     if (vector_length (self.destination.origin - self.origin) < self.distance + local.friendrange) 
  592.                         self exec global/stand.scr
  593.                 }
  594.                 else
  595.                 {
  596.                     if (local.stand == 0)
  597.                     {
  598.                         self exec global/stand.scr
  599.                         local.stand = 1
  600.                     }
  601.                     wait self.waittime
  602.                 }
  603.             }
  604.             else
  605.             if (self.friendtype == 0)
  606.             {
  607.  
  608.                 if (isalive self.destination)
  609.                 {
  610.                     local.lastplayerset = level.playernodeset - 1;
  611.                     self.lastdestination = self.destination
  612.                     self.destinationset = 10
  613.                 }
  614.  
  615.                 local.wanted_node = -1
  616.  
  617.                 if (level.time > local.runtime)
  618.                 {
  619.                     local.entarray = -1
  620.                     local.entarrayentree = 0
  621.                     
  622.                     local.setnum = -1
  623.                     local.nodenum = -1
  624.  
  625.                     if (self.area != -1)
  626.                     {
  627.  
  628.                         if (level.enemyarea[self.area] < 1)
  629.                         {
  630.                             /*
  631.                             for (local.i=1;local.i<level.friendlynodes+1;local.i++)
  632.                             {
  633.                                 if (level.friendlynode[local.i].area == self.area)
  634.                                     level.friendlyused[local.i] = -1
  635.                             }
  636.                             */
  637.  
  638.                             if (level.friendlynode[self.destinationnum].area == self.area)
  639.                                 level.friendlyused[self.destinationnum] = -1
  640.  
  641.                             self.area = -1
  642.                             if (getcvar(debug) == "1")
  643.                                 println (self.entref + " is now at area " + self.area)
  644.  
  645.                         }    
  646.                         else
  647.                         for (local.i=1;local.i<level.friendlynodes+1;local.i++)
  648.                         {
  649. //                            if ((level.friendlynode[local.i].area == self.area) && (level.friendlyused[local.i] == -1))
  650. //                                self.area = -1
  651. //                            else
  652.                             {
  653.                                 local.entnum = -1
  654.                                 local.entset = -1
  655.  
  656.                                 if (level.friendlynode[local.i].area == self.area)
  657.                                 if ((self.destinationset < level.friendlynode[local.i].set) && (level.friendlyused[local.i] == 0) && (self.lastdestination != level.friendlynode[local.i]))
  658.                                 if (level.friendlynode[local.i].set > local.entset)
  659.                                 {
  660.                                     local.entset = level.friendlynode[local.i].set
  661.                                     local.entnum = local.i
  662.                                     local.entarray = -1
  663.                                     local.entarrayentree = -1
  664.                                 }
  665.  
  666.                                 if (local.entnum != -1)
  667.                                 {
  668.                                     local.wanted_node = local.entnum
  669.                                     local.i = level.friendlynodes + 5
  670.                                 }
  671.                                 else
  672.                                 if (level.friendlynode[local.i].area == self.area)
  673.                                 if ((self.lastdestination != level.friendlynode[local.i]) && (self.destinationset <= level.friendlynode[local.i].set) && (level.friendlyused[local.i] == 0))
  674.                                 {
  675.                                     local.entarrayentree++
  676.                                     if (local.entarray == -1)
  677.                                     {
  678.                                         local.entarray = NIL
  679.                                         local.entarrayentree = 1
  680.                                     }
  681.  
  682.                                     local.entarray[local.entarrayentree] = local.i
  683.                                 }
  684.                             }
  685.                         }
  686.                     }
  687.                     else
  688.                     if (local.lastplayerset != level.playernodeset)
  689.                     {
  690.                         if (local.lastplayerset > level.playernodeset)
  691.                             local.direction = down
  692.                         else
  693.                             local.direction = up
  694.  
  695.                         local.lastplayerset = level.playernodeset
  696.                         
  697.                         for (local.i=1;local.i<level.friendlynodes+1;local.i++)
  698.                         {
  699.                             if ((local.i != level.playernodenum) && (local.setnum < level.friendlynode[local.i].set) && ((level.friendlynode[local.i].set > level.playernodeset + self.mins) && (level.friendlynode[local.i].set < level.playernodeset + self.maxs) && (level.friendlyused[local.i] == 0)) && (self.lastdestination != level.friendlynode[local.i]) && (self.destinationset != level.friendlynode[local.i].set))
  700.                             {
  701.                                 local.setnum = level.friendlynode[local.i].set
  702.                                 local.nodenum = local.i
  703.                                 local.wanted_node = local.nodenum
  704.                             }
  705.                         }
  706.  
  707.                         if (local.nodenum == -1)
  708.                         {
  709.                             local.set1 = -1
  710.                             for (local.i1=level.playernodenum+1;local.i1<level.friendlynodes+1;local.i1++)
  711.                             {
  712.                                 if (level.friendlyused[local.i1] == 0)
  713.                                 {
  714.                                     local.set1 = local.i1
  715.                                     local.i1 = level.friendlynodes + 5
  716.                                 }
  717.                             }
  718.  
  719.                             local.set2 = -1
  720.                             for (local.i2=level.playernodenum-1;local.i2>1;local.i2--)
  721.                             {
  722.                                 if (level.friendlyused[local.i2] == 0)
  723.                                 {
  724.                                     local.set2 = local.i2
  725.                                     local.i2 = -5
  726.                                 }
  727.                             }
  728.  
  729.                             if (local.set1 == -1)
  730.                             {
  731.                                 if (local.set2 != -1)
  732.                                     local.nodenum = local.set2
  733.                             }
  734.                             else
  735.                             if (local.set2 == -1)
  736.                                 local.nodenum = local.set1
  737.                             else
  738.                             {
  739.                                 local.preferred = (level.playernodeset + self.mins) * 0.5 + (level.playernodeset + self.maxs) * 0.5
  740.                                 if (abs(local.preferred - level.friendlynode[local.set1].set) < abs(local.preferred - level.friendlynode[local.set2].set))
  741.                                     local.nodenum = local.set1
  742.                                 else
  743.                                     local.nodenum = local.set2
  744.                             }
  745.  
  746.                             local.wanted_node = local.nodenum
  747.  
  748.                             if (getcvar(debug) == "1")
  749.                             if (local.nodenum == -1)
  750.                                 println (self.entref + " failed to find an acceptable node")
  751.                             else
  752.                                 println (self.entref + " is going to go for node with set " + level.friendlynode[local.wanted_node].set + " as a last resort")
  753.                         }
  754.  
  755.                         if (local.nodenum != -1)
  756.                         {
  757.                             if (getcvar(debug) == "1")
  758.                                 println (self.entref + " is at node with set " + self.destinationset + " and wants node with set " + level.friendlynode[local.wanted_node].set)
  759.  
  760.                             if (((local.direction == up) && (level.friendlynode[local.nodenum].set < self.destinationset)) || ((local.direction == down) && (level.friendlynode[local.nodenum].set > self.destinationset)))
  761.                             {
  762. //                                println (self.entref + " was corrected and negated")
  763.                                 local.nodenum = -1
  764.                                 local.wanted_node = -1
  765.                             }
  766.                         }
  767.  
  768.                     }
  769.  
  770.                     if (local.entarray != -1)
  771.                     {
  772.                         local.num = (randomint (local.entarrayentree) + 1)
  773.                         local.i = local.entarray [local.num]
  774.  
  775.                         local.wanted_node = local.i
  776.  
  777.                     }
  778.  
  779.                     if (local.wanted_node != -1)
  780.                     {
  781.                         if (level.friendlynode[self.destinationnum])
  782.                         if (level.friendlynode[self.destinationnum].set)
  783.                         println (self.entref + " gave up node " + level.friendlynode[self.destinationnum].set)
  784.  
  785.                         if (level.friendlyused[self.destinationnum] == 1)
  786.                             level.friendlyused[self.destinationnum] = 0
  787.  
  788.                         self.destinationnum = local.wanted_node
  789.                         println (self.entref + " took node " + level.friendlynode[local.wanted_node].set)
  790.                         thread friendlyused self.destinationnum
  791.                         self.destination = level.friendlynode[local.wanted_node]
  792.                         self.destinationset = level.friendlynode[local.wanted_node].set
  793.  
  794.                         if (level.friendlynode[local.wanted_node].area != -1)
  795.                             self.area = level.friendlynode[local.wanted_node].area
  796.  
  797.                         self turnto NULL                                
  798.                         self waitthread seekdestination local.friendrange local.runtime
  799.                         if (self.destination.thread)
  800.                             self thread level.script::self.destination.thread
  801.  
  802.                     }
  803.  
  804.  
  805. //                    local.stand = waitthread repulsar local.friendrange local.stand
  806.  
  807.                     for (local.i=1;local.i<level.friendlys+1;local.i++)
  808.                     {
  809.                         if (isalive level.friendly[local.i])
  810.                         {
  811.                             if ((self.area == -1) && (level.friendly[local.i].area != -1) && (level.enemyarea[level.friendly[local.i].area] > 0) && (level.friendly[local.i].friendtype == 0))
  812.                             {
  813.                                 self.area = level.friendly[local.i].area
  814.                                 if (self.fnum == NIL)
  815.                                     self.fnum = -2
  816.                             }
  817.  
  818.                         }
  819.                     }
  820.                 }
  821.             }
  822.             else
  823.             if (self.friendtype == 4)
  824.             {
  825.  
  826.                 local.set = 5000
  827.                 local.nodenum = -1
  828.  
  829.  
  830.                 for (local.i=1;local.i<level.friendlynodes+1;local.i++)
  831.                 {
  832.                     if ((level.friendlyused[local.i] == 0) && (level.friendlynode[local.i].set < local.set))
  833.                     {
  834.                         local.set = level.friendlynode[local.i].set
  835.                         local.nodenum = local.i
  836.                         if (getcvar(debug) == "1")
  837.                             println ("SAS wants to go to #SET " + local.set + " and nodenum " + local.nodenum)
  838.                     }
  839.                 }
  840.  
  841.                 if (local.nodenum == -1)
  842.                     local.nodenum = self.destinationnum
  843.                     
  844.                 if (local.nodenum != -1)
  845.                     level.friendlyused[local.nodenum] = 1
  846.                 
  847.                 local.break = 0
  848.                 local.offset = 1 // was 10
  849.                 local.break = 0
  850.  
  851.                 local.turntime = level.time + 2 + randomfloat (0.6)
  852.                 self.turndoneerror = 70
  853.  
  854.                 while (local.break == 0)
  855.                 {
  856.                     if (level.time > local.turntime)
  857.                         self lookat $player
  858.  
  859.                     if (level.time > local.turntime + 1.2 + randomfloat (0.6))
  860.                     {
  861.                         self turnto $player
  862.                         thread turntonull
  863.                         local.turntime = level.time + 9000
  864.                     }
  865.                     
  866. //                    if (getcvar(debug) == "1")
  867. //                        println ("nodenum is " + local.nodenum) // + " and the origin of friendlynode of such nodenum is " + level.friendlynode[local.nodenum].origin)
  868.  
  869.                     // 200 was self.distance
  870.                     local.break = 1
  871.                     if (!(self cansee $player) && (local.set > level.playernodeset + local.offset) )
  872.                         local.break = 0
  873.                     else
  874.                     if ((vector_length (self.origin - $player.origin) > 200) && (level.friendlyused[local.nodenum] == 1) && (local.set > level.playernodeset + local.offset))
  875.                         local.break = 0
  876.                     else
  877.                     if ((vector_length (self.origin - $player.origin) > 200 ) && (local.set > level.playernodeset + local.offset) && !($player canseenoents level.friendlynode[local.nodenum].origin))
  878.                         local.break = 0
  879.                 
  880.  
  881.                     if (getcvar(sas) == "1")
  882.                     {
  883.                         println "------------------------"
  884.                         println ("Break was " + local.break)
  885.  
  886.                         if (self cansee $player)
  887.                             println "SAS could see the player"
  888.                         else
  889.                             println "SAS could NOT see the player"
  890.  
  891.                         if (local.set > level.playernodeset + local.offset)
  892.                             println ("Friendlynode set " + local.set + " was greater than playernode set " + level.playernodeset + " + offset")
  893.                         else
  894.                             println ("Friendlynode set " + local.set + " was NOT greater than playernode set " + level.playernodeset + " + offset")
  895.                 
  896.                         local.length = vector_length (self.origin - $player.origin)
  897.                         if (local.length > 200)
  898.                             println ("Vector length " + local.length + " was greater than 200")
  899.                         else
  900.                             println ("Vector length " + local.length + " was NOT greater than 200")
  901.  
  902.                         if ($player canseenoents (level.friendlynode[local.nodenum].origin + (0 0 50)))
  903.                             println ("Sight trace from player origin to SAS origin was true")
  904.                         else
  905.                             println ("Sight trace from player origin to SAS origin was false")
  906.                         println "------------------------"
  907.                     }
  908.                     wait 0.1
  909.  
  910.                     if (getcvar(hangin) == "1")
  911.                         println (self.entref + " is hangin out at 0 " + local.set)
  912.  
  913.                     if (level.friendlyused[local.nodenum] != 1)
  914.                     {
  915.                         if (getcvar(debug) == "1")
  916.                             println (self.entref + " broke out of " + local.set + " to move on")
  917.  
  918.                         local.break = 1
  919.                     }
  920.  
  921.                 }
  922.  
  923.  
  924.  
  925.                 if (level.friendlynode[self.destinationnum + 1])
  926.                     self thread lookpastlow level.friendlynode[self.destinationnum + 1] 0.6
  927.                 else
  928.                     self thread lookpastlow self.destination 0.6
  929.  
  930. //                wait 0.4
  931.     
  932.                     // println ("****** Turning towards " + self.destination)
  933. //                    self turnto self.destination
  934. //                    thread turntonull
  935. //                wait 0.3
  936.  
  937.                 local.tempnodenum = 0
  938.                 if (!(self cansee $player) && (local.set > level.playernodeset + local.tempnodenum) ) 
  939.                     local.break = 1
  940.                     else
  941.                 if ((vector_length (self.origin - $player.origin) > self.distance) &&  (level.friendlyused[local.nodenum] == 1) && (local.set > level.playernodeset + local.tempnodenum))
  942.                     local.break = -1
  943.  
  944.                 if (local.set < level.playernodeset + local.tempnodenum)
  945.                     local.break = 1
  946.  
  947.  
  948.  
  949.                 if (level.friendlyused[local.nodenum] == 1)
  950.                 if (local.nodenum != -1)
  951.                 {
  952.                     self.destination = level.friendlynode[local.nodenum]
  953.                     self.destinationnum = local.nodenum
  954.                     self.destinationset = level.friendlynode[local.nodenum].set
  955.  
  956.  
  957.     //                println (self + " is running to " + local.set + " which is " + vector_length (self.origin - self.destination.origin) + " distance away")
  958.         
  959.                     if (getcvar(debug) == "1")
  960.                         println (self + " ran to " + self.destination + " at " + self.destination.origin + " with set # " + self.destination.set + " and player has set " + level.playernodeset)
  961.         
  962.                     if (getcvar(debug) == "1")
  963.                         println ("======================== local.set is " + local.set + " and playerset is " + level.playernodeset)
  964.  
  965.                     local.broke = 0
  966.                     self.distance = 350
  967.                     self.movedoneradius = 350
  968.  
  969.                     while (local.broke == 0)
  970.                     {
  971. /*
  972.                         local.break = 1
  973.                         
  974.                         if (local.break == 1)
  975.                             self runto self.destination
  976.                         else
  977.                             self walkto self.destination
  978.                         local.nicetrace = thread nicetrace self $player
  979.                         local.nicetrace2 = thread nicetrace $player self.destination
  980.                         local.teleport = 0
  981.  
  982. //                        if (((thread self nicetrace $player) == -1) && ((thread $player nicetrace self.destination) == -1))
  983.                         if ((local.nicetrace == -1) && (local.nicetrace2 == -1))
  984.                         {
  985.                             local.teleport = 1
  986.                             self.origin = self.destination.origin
  987.                             println "OSS TELEPORTATION"
  988.                         }
  989.                         else
  990. */
  991.                             self runto self.destination
  992.  
  993. //                        println ("set is " + self.destination.set)
  994.  
  995.                         if (getcvar(debug) == "1")
  996.                             println ("1 Friendly used is " + level.friendlyused[local.nodenum])
  997.  
  998.                         local.elapsedtime = level.time + 6
  999.  
  1000.                         if (getcvar(debug) == "1")
  1001.                             println (self.entref + " may hang out at 1 " + local.set)
  1002.                         self.checkmovedone = 0
  1003.  
  1004.                         thread checkmovedone
  1005.                         
  1006.     //                    while ((vector_length (self.origin - self.destination.origin) > self.distance) && ( level.friendlyused[local.nodenum] == 1))
  1007.     //                    while ((vector_length (self.origin - self.destination.origin) > self.distance) && ( level.friendlyused[local.nodenum] == 1))
  1008.                         while ((self.checkmovedone == 0) && ( level.friendlyused[local.nodenum] == 1))
  1009.                         {
  1010.                             if (getcvar(hangin) == "1")        
  1011.                                 println (self.entref + " is hangin out at 1 " + local.set)
  1012.  
  1013.                             wait self.waittime
  1014.                             /*
  1015.                             if (level.time > local.elapsedtime)
  1016.                                 self runto self.destination
  1017.                             */
  1018.                         }
  1019.  
  1020.                         if (self.checkthread)
  1021.                             self.checkthread delete
  1022.  
  1023.                         if (self.destination.target)
  1024.                         {
  1025.                             local.ent = self.destination.target
  1026.                             while (local.ent.target)
  1027.                                 local.ent = local.ent.target
  1028.  
  1029.                             local.origin = local.ent.origin
  1030.                         }
  1031.                         else
  1032.                         local.origin = self.destination.origin
  1033.  
  1034.                         if (vector_length (self.origin - local.origin) < self.distance + 25)
  1035.                             local.broke = 1
  1036.  
  1037.                         waitframe
  1038.                     }
  1039.  
  1040.  
  1041.                     if (getcvar(debug) == "1")
  1042.                         println ("2 Friendly used is " + level.friendlyused[local.nodenum])
  1043.  
  1044.                     if (level.friendlynode[local.nodenum].flag != NIL) 
  1045.                     {
  1046. //                        self waittill movedone
  1047. //                        while (parm.movedone == 0)
  1048.                         self.movedoneradius = 0                    
  1049.                         while (vector_length (self.origin - level.friendlynode[local.nodenum].origin) > 100)
  1050.                         {
  1051.                             if (getcvar(hangin) == "1")
  1052.                                 println (self.entref + " is hangin out at 4 " + local.set)
  1053.  
  1054.                                 if (getcvar(debug) == "1")
  1055.                                     println ("======================== local.set is " + local.set + " and playerset is " + level.playernodeset)
  1056.  
  1057.                                 if (local.break == 1)
  1058.                                         self runto self.destination
  1059.                                     else
  1060.                                         self walkto self.destination
  1061.  
  1062.                                     self waittill movedone
  1063.                                     waitframe
  1064.  
  1065.                             if (getcvar(hangin) == "1")
  1066.                                 println (self.entref + " is hangin out at 3 " + local.set)
  1067.  
  1068.                         }
  1069.  
  1070.                         if (level.friendlynode[local.nodenum].flag != NIL) 
  1071.                         if (level.friendlyused[local.nodenum] == 1)
  1072.                         {
  1073.                             self.avoidplayer = 1
  1074.                             self thread level.script::("flagthread" + level.friendlynode[local.nodenum].flag)
  1075.                             level.friendlynode[local.nodenum].flag = NIL
  1076.                         }
  1077.                         else
  1078.                             if (getcvar(debug) == "1")
  1079.                             println ("Didn't run flagthread " + ("flagthread" + level.friendlynode[local.nodenum].flag))
  1080.                     }
  1081.  
  1082.  
  1083.                 }
  1084.             }
  1085.             else
  1086.             if (self.friendtype == 5)
  1087.             {
  1088.                 if (level.time > self.lasthealed)
  1089.                 {
  1090.                     self.lasthealed = level.time + level.medictime
  1091.  
  1092.  
  1093.                     waitthread heal $player
  1094.                     for (local.i=1;local.i<level.friendlys+1;local.i++)
  1095.                     if (level.friendly[local.i] != self)
  1096.                         waitthread heal level.friendly[local.i]
  1097.  
  1098.                     if ((self.health * 100) / self.maxhealth < 40)
  1099.                         waitthread canteen
  1100.                 }
  1101.  
  1102.  
  1103. //                if (level.time > local.runtime)
  1104.                 {
  1105.  
  1106.                     if (isalive level.friendly3 && self!=level.friendly3 )
  1107.                     {
  1108.                         self.destination = level.friendly3
  1109.                     }
  1110.                     else
  1111.                     {
  1112.                         if (isalive level.friendly2 && self!=level.friendly2 )
  1113.                         {
  1114.                             self.destination = level.friendly2
  1115.                         }
  1116.                         else
  1117.                         {
  1118.                             if ( isalive level.friendly1 && self!=level.friendly1 )
  1119.                             {
  1120.                                 self.destination = level.friendly1
  1121.                             }
  1122.                             else
  1123.                             {
  1124.                                 self.destination = $player
  1125.                             }
  1126.                         }
  1127.                     }
  1128.  
  1129.                     self.distance = 150
  1130.                     self.movedoneradius = self.distance - 25
  1131.                     if (vector_length (self.destination.origin - self.origin) > self.distance + local.friendrange) 
  1132.                     {
  1133.                         self runto self.destination
  1134.                         self waittill movedone
  1135.                         self exec global/crouch.scr // was stand
  1136.                     }
  1137.  
  1138. //                    local.stand = waitthread repulsar local.friendrange local.stand
  1139. /*
  1140.                     if (level.friendlyavoid == 1)
  1141.                     {
  1142.                         if (vector_length (self.destination.origin - self.origin) < self.distance - local.friendrange)
  1143.                         {
  1144.                             local.ai_gap = self.distance + local.friendrange
  1145.                             while (vector_length (self.destination.origin - self.origin) < self.distance + local.friendrange)
  1146.                             {
  1147.  
  1148.                                 local.ent = spawn script_origin
  1149.                                 local.player_ai_delta = vector_normalize (self.origin - self.destination.origin) * local.ai_gap
  1150.                                 local.ent.origin = local.player_ai_delta + self.destination.origin
  1151.                                 self runto local.ent.origin
  1152.                                 local.repulsetime = level.time + 2
  1153.  
  1154.                                 while ((vector_length (self.destination.origin - self.origin) > self.distance - local.friendrange) && (level.time < local.repulsetime))
  1155.                                     waitframe
  1156.  
  1157.                                 local.ent remove
  1158.  
  1159.                                 waitframe
  1160.                             }
  1161.                         }
  1162.                         else
  1163.                         if ((vector_length (self.destination.origin - self.origin) < self.distance + local.friendrange) && (local.stand == 0))
  1164.                         {
  1165.                             local.stand = 1
  1166.                             self exec global/stand.scr
  1167.  
  1168.                             if (self.waittime == -1)
  1169.                                 waitframe
  1170.                             else
  1171.                                 wait self.waittime
  1172.                         }
  1173.                     }
  1174.  
  1175. */
  1176.                     /*
  1177.                     if (vector_length (self.destination.origin - self.origin) < self.distance - local.friendrange) 
  1178.                     {
  1179.                         local.standtime = level.time + 2
  1180.                         if (local.stand == 0)
  1181.                         {
  1182.                             self exec global/stand.scr
  1183.                             local.stand = 1
  1184.                         }
  1185.                         if (self.waittime == -1)
  1186.                             waitframe
  1187.                         else
  1188.                             wait self.waittime
  1189.                     }
  1190.                     */
  1191.                 }
  1192.  
  1193. /*
  1194.  
  1195.                 if (level.friendlyavoid == 1)
  1196.                 {
  1197.                     if (vector_length (self.destination.origin - self.origin) < self.distance - local.friendrange)
  1198.                     {
  1199.                         local.ai_gap = self.distance + local.friendrange 
  1200.                         while (vector_length (self.destination.origin - self.origin) < self.distance + local.friendrange)
  1201.                         {
  1202.  
  1203.                             local.ent = spawn script_origin
  1204.                             local.player_ai_delta = vector_normalize (self.origin - self.destination.origin) * local.ai_gap
  1205.                             local.ent.origin = local.player_ai_delta + self.destination.origin
  1206.                             self runto local.ent.origin
  1207.                             local.repulsetime = level.time + 2
  1208.  
  1209.                             while ((vector_length (self.destination.origin - self.origin) > self.distance - local.friendrange) && (level.time < local.repulsetime))
  1210.                                 waitframe
  1211.  
  1212.                             local.ent remove
  1213.  
  1214.                             waitframe
  1215.                         }
  1216.                     }
  1217.                     else
  1218.                     if ((vector_length (self.destination.origin - self.origin) < self.distance + local.friendrange) && (local.stand == 0))
  1219.                     {
  1220.                         local.stand = 1
  1221.                         self exec global/stand.scr
  1222.  
  1223.                         if (self.waittime == -1)
  1224.                             waitframe
  1225.                         else
  1226.                             wait self.waittime
  1227.                     }
  1228.                 }
  1229.  
  1230. */
  1231.             }
  1232.             else
  1233.             if (self.friendtype == 6)
  1234.             {
  1235.  
  1236.                 if (level.friendlyused[self.destinationnum] == 1)
  1237.                     level.friendlyused[self.destinationnum] = 0
  1238.  
  1239.                     local.run = 0
  1240.                 if (vector_length (self.destination.origin - self.origin) < 100)
  1241.                     self exec global/stand.scr
  1242.                 else
  1243.                 {
  1244.                     self runto self.destination.origin
  1245.                     local.run = 1
  1246.                 }
  1247.  
  1248.                 while (vector_length (self.destination.origin - self.origin) > 100)
  1249.                 {
  1250.                     if (getcvar(debug) == "1")
  1251.                         println "running"
  1252.         
  1253.                     wait self.waittime
  1254.                 }
  1255.         
  1256.  
  1257.                 wait self.waittime
  1258.  
  1259.             }
  1260.             else
  1261.             if (self.friendtype == 7)
  1262.             {
  1263.                 if (level.time > local.runtime)
  1264.                 {
  1265.                     local.entarray = -1
  1266.                     local.entarrayentree = 0
  1267.                     
  1268.                     local.setnum = -1
  1269.                     local.nodenum = -1
  1270.  
  1271.                     if ((self.destinationset < level.playernodeset + self.mins) || (self.destinationset > level.playernodeset + self.maxs))
  1272.                     {
  1273.                         for (local.i=1;local.i<level.friendlynodes+1;local.i++)
  1274.                         {
  1275.                             if ((level.friendlynode[local.i].set > self.destinationset) && (local.setnum < level.friendlynode[local.i].set) && ((level.friendlynode[local.i].set > level.playernodeset + self.mins) && (level.friendlynode[local.i].set < level.playernodeset + self.maxs) && (level.friendlyused[local.i] == 0)) && (self.lastdestination != level.friendlynode[local.i]) && (self.destinationset != level.friendlynode[local.i].set))
  1276.                             {
  1277.                                 {
  1278.                                     local.setnum = level.friendlynode[local.i].set
  1279.                                     local.nodenum = local.i
  1280.                                 }
  1281.  
  1282.                                 if (local.nodenum != -1)
  1283.                                 {
  1284.  
  1285.                                     if (level.friendlyused[self.destinationnum] == 1)
  1286.                                         level.friendlyused[self.destinationnum] = 0
  1287.  
  1288.                                     self.destinationnum = local.nodenum
  1289.                                     thread friendlyused self.destinationnum
  1290.                                     self.destination = level.friendlynode[local.nodenum]
  1291.                                     self.destinationset = level.friendlynode[local.nodenum].set
  1292.                                     
  1293.                                     if (level.friendlynode[local.nodenum].area != -1)
  1294.                                     {
  1295.                                         self.area = level.friendlynode[local.nodenum].area
  1296.                                         if (getcvar(debug) == "1")
  1297.                                             println (self + " joined area " + self.area)
  1298.                                     }
  1299.                                 }
  1300.                             }
  1301.                         }
  1302.                     }
  1303.                                 
  1304.                     self waitthread seekdestination local.friendrange local.runtime
  1305.  
  1306.                 }
  1307.             }
  1308.             else
  1309.             if (self.friendtype == 9)
  1310.             {
  1311.                 self.friendtype = 0
  1312.             /*                
  1313.                 local.setnum = -1
  1314.                 local.nodenum = -1
  1315.  
  1316.                 for (local.i=1;local.i<level.friendlynodes+1;local.i++)
  1317.                 if ((local.setnum < level.friendlynode[local.i].set) && (level.friendlynode[local.i].set > level.playernodeset + self.mins) && (level.friendlynode[local.i].set < level.playernodeset + self.maxs) && (level.friendlyused[local.i] == 0))
  1318.                 {
  1319.                     local.setnum = level.friendlynode[local.i].set
  1320.                     local.nodenum = local.i
  1321.                 }
  1322.  
  1323.                 if (local.nodenum != -1)
  1324.                 {
  1325.                     local.wanted_node = local.nodenum
  1326.                     if (getcvar(debug) == "1")
  1327.                     if (level.friendlynode[self.destinationnum])
  1328.                     if (level.friendlynode[self.destinationnum].set)
  1329.                     println (self.entref + " gave up node " + level.friendlynode[self.destinationnum].set)
  1330.  
  1331.                     if (level.friendlyused[self.destinationnum] == 1)
  1332.                         level.friendlyused[self.destinationnum] = 0
  1333.  
  1334.                     self.destinationnum = local.wanted_node
  1335.                     println (self.entref + " took node " + level.friendlynode[local.wanted_node].set)
  1336.                     thread friendlyused self.destinationnum
  1337.                     self.destination = level.friendlynode[local.wanted_node]
  1338.                     self.destinationset = level.friendlynode[local.wanted_node].set
  1339.  
  1340.                     if (level.friendlynode[local.wanted_node].area != -1)
  1341.                         self.area = level.friendlynode[local.wanted_node].area
  1342.  
  1343.                     self.friendtype = 0
  1344.                 }
  1345.             */
  1346.             }
  1347.         }
  1348.         else
  1349.         wait self.waittime
  1350.         
  1351.     }
  1352.  
  1353.     if (self.destinationnum != NIL)
  1354.     if ((level.friendlyused[self.destinationnum] == 1) && (self.friendtype == 0))
  1355.         level.friendlyused[self.destinationnum] = 0
  1356.     
  1357. end
  1358.  
  1359. canteen:
  1360.  
  1361.     if (self.canteen == NIL)
  1362.         self.canteen = 0
  1363.  
  1364.     self.canteen++
  1365. //    while (self.thinkstate == "attack")
  1366. //        waitframe
  1367.  
  1368.     if (self.canteen < 3)
  1369.     {
  1370.         wait 1
  1371.         self lookat NULL
  1372.         self nodamage
  1373.         self upperanim pass_canteen_drink
  1374.         self waittill upperanimdone
  1375.  
  1376.         if (getcvar(debug) != "1")
  1377.         self takedamage
  1378.             self.health = self.maxhealth
  1379.     }
  1380.  
  1381. end
  1382.  
  1383.  
  1384. checkmovedone:
  1385.     if (self.checkthread)
  1386.         self.checkthread delete
  1387.  
  1388.     self.checkthread = local
  1389.  
  1390.     println "started the wait"
  1391.     self waittill movedone
  1392.     println "ended the wait"
  1393.     self.checkmovedone = 1
  1394.  
  1395.  
  1396. end
  1397.  
  1398.  
  1399.  
  1400. heal local.ent:
  1401.     if (isalive local.ent)
  1402.     {
  1403.  
  1404.         local.health = (local.ent.health * 100) / local.ent.maxhealth
  1405.  
  1406.         if (local.health < level.medicmin)
  1407.         {
  1408.             self.no_idle = 0
  1409.  
  1410.             self.movedoneradius = 100
  1411.             self runto local.ent
  1412.             self waittill movedone
  1413.  
  1414.             self exec global/stand.scr
  1415.             
  1416.             if (isalive local.ent)
  1417.             {
  1418.                 local.vec = vector_length (self.origin - local.ent.origin)
  1419.                 if (local.vec < 140)
  1420.                 {
  1421.                     self nodamage
  1422.                     self.avoidplayer = 0
  1423. //                    self.no_idle = 1
  1424.                     self turnto local.ent
  1425.                     self waittill turndone
  1426.                     self upperanim pass_canteen_start
  1427.                     self waittill upperanimdone
  1428.  
  1429.                     local.ent heal 0.5
  1430.                     self playsound med_kit
  1431.  
  1432.                     self upperanim pass_canteen_end
  1433.                     self waittill upperanimdone
  1434.  
  1435.                     self.avoidplayer = 1
  1436.  
  1437.                     if (getcvar(alive) != "1")
  1438.                         self takedamage
  1439. //                    self.no_idle = 0
  1440.  
  1441.  
  1442.                 }
  1443.             }
  1444.             if (getcvar(debug) == "1")
  1445.                 println ("medic healed " + local.ent)
  1446.         }
  1447.     }
  1448. end
  1449.  
  1450.  
  1451. friendlyrepulse: 
  1452.  
  1453.     while (isalive self)
  1454.     {
  1455.         local.range = 40
  1456.         for (local.i=1;local.i<level.friendlys+1;local.i++)
  1457.         {
  1458.             if ((isalive level.friendly[local.i]) && (self != level.friendly[local.i]))
  1459.             {
  1460.                 local.newrange = vector_length (self.origin - level.friendly[local.i].origin)
  1461.                 println local.newrange
  1462.                 if (local.newrange < local.range)
  1463.                 {
  1464.                     local.repulse = level.friendly[local.i]
  1465.                     local.range = local.newrange
  1466.                 }
  1467.             }
  1468.         }
  1469.  
  1470.         if (local.repulse)
  1471.         {
  1472.             local.ai_gap = 55
  1473.             local.avoidtime = level.time + 5.5 + randomfloat (1)
  1474. //            while ((vector_length (local.repulse.origin - self.origin) < 70) && (level.time < local.avoidtime))
  1475. //            {
  1476. //                local.ent = spawn script_origin "targetname" self.fnum
  1477. //                local.ent model animal/cockroach.tik
  1478. //                local.ent scale 100
  1479.                 local.player_ai_delta = vector_normalize (self.origin - local.repulse.origin) * local.ai_gap
  1480. //                local.ent.origin = local.player_ai_delta + local.repulse.origin + ( 0 0 25 )
  1481.                 local.origin = local.player_ai_delta + local.repulse.origin + ( 0 0 25 )
  1482.                 self runto local.origin
  1483. //                wait 2
  1484. //                waitframe
  1485. //                local.ent remove
  1486. //            }    
  1487.  
  1488.     //        self thread ailookstand
  1489. //            if (vector_length (self.origin - local.repulse.origin) > 60)
  1490. //                self exec global/stand.scr
  1491.         }
  1492.  
  1493.         wait 3
  1494.     }
  1495.  
  1496. end
  1497.  
  1498.  
  1499.  
  1500. repulsar local.friendrange local.stand: 
  1501.     if (level.friendlyavoid == 1)
  1502.     {
  1503.         if (vector_length ($player.origin - self.origin) < self.distance - local.friendrange)
  1504.         {
  1505.             local.ai_gap = self.distance + local.friendrange
  1506.             while (vector_length ($player.origin - self.origin) < self.distance + local.friendrange)
  1507.             {
  1508.  
  1509.                 local.ent = spawn script_origin
  1510.                 local.player_ai_delta = vector_normalize (self.origin - $player.origin) * local.ai_gap
  1511.                 local.ent.origin = local.player_ai_delta + $player.origin
  1512.                 self runto local.ent.origin
  1513.                 local.repulsetime = level.time + 2
  1514.  
  1515.                 while ((vector_length ($player.origin - self.origin) > self.distance - local.friendrange) && (level.time < local.repulsetime))
  1516.                     waitframe
  1517.  
  1518.                 local.ent remove
  1519.  
  1520.                 waitframe
  1521.             }
  1522.         }
  1523.         else
  1524.         if ((vector_length ($player.origin - self.origin) < self.distance + local.friendrange) && (local.stand == 0))
  1525.         {
  1526.             self thread ailookstand
  1527.             self exec global/stand.scr
  1528.             local.stand = 1
  1529.  
  1530.             if (getcvar(debug) == "1")
  1531.                 println (self.entref + " stood at " + level.time)
  1532.  
  1533.             if (self.waittime == -1)
  1534.                 waitframe
  1535.             else
  1536.                 wait self.waittime
  1537.         }
  1538.     }
  1539.  
  1540.     if (self.destination != $player)    
  1541.     if (vector_length (self.destination.origin - self.origin) < self.distance - local.friendrange)
  1542.     {
  1543.         local.ai_gap = self.distance + local.friendrange
  1544.         while (vector_length (self.destination.origin - self.origin) < self.distance + local.friendrange)
  1545.         {
  1546.  
  1547.             local.ent = spawn script_origin
  1548.             local.player_ai_delta = vector_normalize (self.origin - self.destination.origin) * local.ai_gap
  1549.             local.ent.origin = local.player_ai_delta + self.destination.origin
  1550.             self runto local.ent.origin
  1551.             local.repulsetime = level.time + 2
  1552.  
  1553.             while ((vector_length (self.destination.origin - self.origin) > self.distance - local.friendrange) && (level.time < local.repulsetime))
  1554.                 waitframe
  1555.  
  1556.             local.ent remove
  1557.  
  1558.             waitframe
  1559.         }
  1560.     }
  1561.     else
  1562.     if ((vector_length (self.destination.origin - self.origin) < self.distance + local.friendrange) && (local.stand == 0))
  1563.     {
  1564.         self thread ailookstand
  1565.         local.stand = 1
  1566.         self exec global/stand.scr
  1567.  
  1568.         if (self.waittime == -1)
  1569.             waitframe
  1570.         else
  1571.             wait self.waittime
  1572.     }
  1573.  
  1574. end local.stand         
  1575.  
  1576. // huh
  1577. seekdestination local.friendrange local.runtime:
  1578.  
  1579.     if (getcvar(debug) == "1")
  1580.         println "1seeking destination"
  1581.  
  1582.     if ((vector_length(self.origin - self.destination.origin) > self.distance - local.friendrange) && (self.destination != NIL))
  1583.     {
  1584.         self thread ailookrun
  1585.  
  1586.         if (getcvar(debug) == "1")
  1587.         if ((self.destination.area != NIL) && (self.destination.area != -1))
  1588.         {
  1589.             println (self.entref + " is trying to run to area " + self.destination.area + " with nodeset " + self.destinationnum + "/" + self.destinationset)
  1590. //            println ("self destination's node/set is " + self.destination. 
  1591.  
  1592.         }
  1593.  
  1594.     if (getcvar(debug) == "1")
  1595.         println "2seeking destination"
  1596.  
  1597.         
  1598.         self.movedoneradius = 90 // self.distance - local.friendrange
  1599.         if (getcvar(debug) == "1")
  1600.             println (self.entref + " is running to " + self.destinationset)
  1601.         self runto self.destination
  1602.         self waittill movedone
  1603.         if (getcvar(debug) == "1")
  1604.             println (self.entref + " arrived")
  1605.     
  1606.         self thread ailookrun
  1607.  
  1608. //        local.runtime = level.time + 2
  1609.  
  1610. //        while ((vector_length (self.origin - self.destination.origin) > self.distance - local.friendrange) && (level.playernodeset > self.destinationset + self.mins) && (level.playernodeset < self.destinationset + self.maxs))
  1611. //            wait self.waittime
  1612.  
  1613.  
  1614. //        self.lookthread delete
  1615.     }
  1616.     else
  1617.     {
  1618.         wait 1
  1619.         thread friendlyused self.destinationnum
  1620.     }
  1621.  
  1622.     self.lastdestination = self.destination
  1623.  
  1624. end
  1625.  
  1626. movedone:
  1627.     self.movedone = 0
  1628.     self waittill movedone
  1629.     self.movedone = parm.movedone
  1630. end
  1631.  
  1632.  
  1633. repulse:
  1634.     local.ai_gap = 150
  1635.     spawn script_origin targetname temp_scr_org
  1636.     local.player_ai_delta = vector_normalize (self.origin - self.destination.origin) * local.ai_gap
  1637.     $temp_scr_org.origin = local.player_ai_delta + self.destination.origin
  1638.     self runto $temp_scr_org.origin
  1639.     self waittill movedone
  1640.     $temp_scr_org remove
  1641. end
  1642.  
  1643.  
  1644.  
  1645.  
  1646.  
  1647.  
  1648.  
  1649. turntonull:
  1650.     thread turntonull1
  1651.     thread turntonull2
  1652. end
  1653.  
  1654. turntonull1:    
  1655.     self waittill turndone
  1656.     self turnto NULL
  1657. end
  1658.  
  1659. turntonull2:    
  1660.     wait 2
  1661.     self turnto NULL
  1662. end
  1663.  
  1664.  
  1665.  
  1666. ailookstand:
  1667.  
  1668.     if (self.lookthread != NIL)
  1669.         self.lookthread delete
  1670.  
  1671.     if (self.look == 0)
  1672.         end
  1673.  
  1674.  
  1675. //    self lookat level.friendly1 
  1676. //    end
  1677.  
  1678.     self.lookthread = local
  1679. //    self lookat self.destination
  1680. //    wait (randomfloat (3) + 2)
  1681.  
  1682.     while (isalive self)
  1683.     {    
  1684.         println "WTF"
  1685.         local.random = randomint(100)
  1686.         if (local.random > 50)
  1687.         {
  1688.             if (level.friendlynodes > 0)
  1689.             {
  1690.         
  1691.                 if (level.friendlynode[self.destinationnum])
  1692.                 local.look = level.friendlynode[self.destinationnum]
  1693.                 else
  1694.                 local.look = 1
  1695.  
  1696.                 while (level.friendlynode[local.look] == self.destination)
  1697.                 {
  1698.                     local.look = level.playernodenum + randomint(10) - 5
  1699.                     if (local.look < 1)
  1700.                         local.look = 1
  1701.  
  1702.                     if (local.look > level.friendlynodes)
  1703.                         local.look = level.friendlynodes
  1704.                 }
  1705.                     
  1706.                 if (vector_length (self.origin - level.friendlynode[local.look].origin) > 180)
  1707.                 {
  1708.                     self thread lookpastlow level.friendlynode[local.look]
  1709.                     self.turndoneerror = 70
  1710.                     self thread turn_null level.friendlynode[local.look]
  1711.                 }
  1712.             }
  1713.             else
  1714.             {
  1715.                 local.look = randomint(level.friendlys) + 1
  1716.  
  1717.                 if (local.look < 1)
  1718.                     local.look = 1
  1719.  
  1720.                 if (local.look > level.friendlys)
  1721.                     local.look = level.friendlys
  1722.  
  1723.                 if (isalive level.friendly[local.look])
  1724.                 {
  1725.                     self lookat level.friendly[local.look]
  1726.                     self.turndoneerror = 30
  1727.                     self thread turn_null level.friendly[local.look]
  1728.                 }
  1729.             }
  1730.         }
  1731.         else
  1732.         if (vector_length (self.origin - self.destination.origin) > 180)
  1733.         {
  1734.             self thread lookpastlow self.destination
  1735.             self.turndoneerror = 30
  1736.             self thread turn_null self.destination
  1737.         }
  1738.  
  1739.         wait (randomfloat (6) + 1.5)
  1740.     }
  1741. end
  1742.  
  1743. turn_null local.ent:
  1744.     self.turndoneerror = 70
  1745.     self turnto local.ent
  1746.     self waittill turndone
  1747.     self turnto NULL
  1748. end
  1749.  
  1750.  
  1751. ailookrun:
  1752.  
  1753.     if (self.lookthread != NIL)
  1754.         self.lookthread delete
  1755.  
  1756.     if (self.look == 0)
  1757.         end
  1758.  
  1759.     self.lookthread = local
  1760.  
  1761.     self lookat NULL
  1762.  
  1763.     local.wait_time = 0.5
  1764.  
  1765.     while (isalive self)
  1766.     {    
  1767.         if (level.time > self.lookat_time)
  1768.         {
  1769.             local.random = randomint(100)
  1770.             
  1771.             if ((level.friendlynodes > 0) && (local.random > 75))
  1772.             {
  1773.                 local.look = level.playernodenum + randomint(4) + 4
  1774.  
  1775.                 if (self.destination == level.friendlynode[local.look])
  1776.                     local.look++
  1777.  
  1778.                 if (local.look > level.friendlynodes)
  1779.                     local.look = level.friendlynodes
  1780.  
  1781.                 if (vector_length (self.origin - level.friendlynode[local.look].origin) < 200)
  1782.                     local.look++
  1783.  
  1784.                 if (local.look > level.friendlynodes)
  1785.                     local.look = level.friendlynodes
  1786.  
  1787.                 self thread lookpastlow level.friendlynode[local.look]
  1788.                 local.wait_time = (randomfloat (3) + 1)
  1789.             }
  1790.             else if (local.random > 50)
  1791.             {
  1792.                 local.ent = level.friendly[randomint(level.friendlys) + 1]
  1793.  
  1794.     //            if (sighttrace (self.origin + (0 0 35)) (local.ent.origin + (0 0 35)) 1)
  1795.                 if ((isalive local.ent) && (self cansee local.ent 90))
  1796.                 {
  1797.                     self lookat local.ent
  1798.                     local.wait_time = (randomfloat (1.5) + 0.5)
  1799.                 }
  1800.                 else
  1801.                 {
  1802.                     self lookat NULL
  1803.                     local.wait_time = 0.5
  1804.                 }
  1805.             }
  1806.             else if (local.random > 25)
  1807.             {
  1808.                 self lookat $player
  1809.                 local.wait_time = (randomfloat (1.5) + 0.5)
  1810.             }
  1811.             else
  1812.             {
  1813.                 self lookat NULL
  1814.                 local.wait_time = 0.5
  1815.             }
  1816.  
  1817.             self.lookat_time = level.time + local.wait_time 
  1818.  
  1819.             wait local.wait_time 
  1820.             self lookat NULL
  1821.             wait (1 + randomfloat(1))
  1822.         }
  1823.         else
  1824.             wait 1
  1825.     }
  1826. end
  1827.  
  1828.  
  1829.  
  1830. drawline:
  1831.     while (1)
  1832.     {
  1833.         if (getcvar(line) == "1")
  1834.         {
  1835.             for (local.i=1;local.i<level.friendlys+1;local.i++)
  1836.             if ((isalive level.friendly[local.i]) && (level.friendly[local.i].destination) && (level.friendly[local.i].destination.origin) && (level.friendly[local.i].thinkstate != "attack"))
  1837.                 debugline level.friendly[local.i] level.friendly[local.i].destination.origin 0.2 0.8 0.65 0.5
  1838.         }
  1839.         else
  1840.         wait 2
  1841.  
  1842.         waitframe
  1843.         waitframe
  1844.     }
  1845. end
  1846.  
  1847.  
  1848. nodeprint:
  1849.  
  1850.  
  1851.     thread drawline
  1852.     local.p = 0
  1853.     local.z = 0
  1854.  
  1855.     // Don't forget, DISABLE FOR RELEASE
  1856.  
  1857.     local.timer = level.time
  1858.     while (1)
  1859.     {
  1860.         if (getcvar(debug) == "1")
  1861.         {
  1862.             local.p = local.z
  1863.  
  1864.             if (level.time > local.timer)
  1865.             {
  1866.                 local.z++
  1867.                 local.timer = level.time + 1
  1868.                 if (local.z > 2)
  1869.                     local.z = 0
  1870.             }
  1871.  
  1872.             for (local.i=1;local.i<level.friendlynodes+1;local.i++)
  1873.             {
  1874.                 local.p++
  1875.                 if (local.p == 3)
  1876.                 {
  1877.                     thread tempprint3d (level.friendlynode[local.i].origin + (0 0 35)) 2 level.friendlynode[local.i].set
  1878.                     if (level.friendlynode[local.i].thread)
  1879.                         thread tempprint3d (level.friendlynode[local.i].origin + (0 0 65)) 2 level.friendlynode[local.i].thread
  1880.                     local.p = 0
  1881.                 }
  1882.             }
  1883.             waitframe
  1884.         }
  1885.         else
  1886.         {
  1887.             wait 1
  1888.         }
  1889.  
  1890.     }
  1891.  
  1892. end
  1893.  
  1894. tempprint3d local.org local.sizer local.num:
  1895.     level waittill postthink
  1896.     print3d local.org local.sizer local.num
  1897. end
  1898.  
  1899.  
  1900. playernode:
  1901.     $player.fnum = -1
  1902.     if (level.usedrange == NIL)
  1903.         level.usedrange = 2
  1904.  
  1905.  
  1906.     level.playernodenum = 1
  1907.     level.playernodeset = 1
  1908.     println ("playernodeset is " + level.playernodeset)
  1909.  
  1910.     level waittill spawn
  1911.     thread nodeprint
  1912.  
  1913. //    level.playernodeset = level.friendlynode[level.playernodenum].set
  1914. //    println ("level playernodeset is " + level.playernodeset)
  1915. //    level.playernoderadius = 50000
  1916.  
  1917.  
  1918.     local.setnum = 0
  1919.     level.playernode = level.friendlynode[1]
  1920.     level.playernoderadius = vector_length (level.friendlynode[level.playernodenum].origin - $player.origin)
  1921.  
  1922.     local.num = level.playernodenum
  1923.  
  1924.     for (local.i=1;local.i<level.friendlys+1;local.i++)
  1925.         local.number[local.i] = level.friendly[local.i].area
  1926.  
  1927.     local.min = -10
  1928.     local.max = 10
  1929.  
  1930.     thread playernode_evaluate
  1931.  
  1932.     local.playerheld = -1
  1933.     while (1)
  1934.     {
  1935.         if (level.script == "maps/m1l2a.scr")
  1936.         {
  1937. //            println "held is -1"
  1938.             local.playerheld = -1
  1939.         }
  1940.     local.playerheld = -1
  1941.  
  1942.         if (local.playerheld != -1)
  1943.         {
  1944.             level.friendlyused[local.playerheld] = 0
  1945.             local.playerheld = -1
  1946.         }
  1947.         // debug stuff
  1948.         /*
  1949.         for (local.i=1;local.i<level.friendlys+1;local.i++)
  1950.         {
  1951.             if ((isalive level.friendly[local.i]) && (level.friendly[local.i].area != NIL))
  1952.             if (local.number[local.i] != level.friendly[local.i].area)
  1953.             {
  1954.  
  1955.                     println "-**************************************-"
  1956.                 for (local.p=1;local.p<level.friendlys+1;local.p++)
  1957.                 {
  1958.                     if ((isalive level.friendly[local.p]) && (level.friendly[local.p].area != NIL))
  1959.                     {
  1960.                         huddraw_font (local.i + 100) "facfont-20"
  1961.                         huddraw_string (local.i + 100) level.friendly[local.p].area
  1962.                         huddraw_align (local.i + 100) left top
  1963.                         huddraw_rect (local.i + 100) 0 (80 + local.i*18) 0 0
  1964.                         local.number[local.p] = level.friendly[local.p].area
  1965.  
  1966. //                        println (level.friendly[local.p] + " is exploring area " + level.friendly[local.p].area)
  1967.                     }
  1968.                 }
  1969.                     println "-**************************************-"
  1970.                 local.i = level.friendlys + 5
  1971.             }
  1972.         }
  1973.         */
  1974.  
  1975.         level.playernoderadius = vector_length (level.friendlynode[level.playernodenum].origin - $player.origin)
  1976. //        level.playernoderadius = 50000
  1977.         local.p = 0
  1978.         local.newnum = -1
  1979.         local.lowset = level.playernodenum + local.min
  1980.  
  1981.         if (local.lowset < 1)
  1982.             local.lowset = 1
  1983.  
  1984.             local.highset = level.playernodenum + local.max
  1985.  
  1986.         if (local.highset > level.friendlynodes)
  1987.             local.highset = level.friendlynodes
  1988.  
  1989.         if (getcvar(playerset) == "1")
  1990.             println ("highset is " + local.highset + " with set " + level.friendlynode[local.highset].set)
  1991.  
  1992.         if (local.setnum != level.playernodenum)
  1993.         {
  1994.         if (getcvar(playerset) == "1")
  1995.                 println ("lowest = " + local.lowset + " and highest = " + local.highset + " and playernum = " + level.playernodenum)
  1996.  
  1997.             local.setnum = level.playernodenum
  1998.         }
  1999.  
  2000.         for (local.i=local.lowset;local.i<local.highset+1;local.i++)
  2001.         if (level.friendlyused[local.i] < level.usedrange)
  2002.         {
  2003.             local.radius = vector_length (level.friendlynode[local.i].origin - $player.origin)
  2004.             if (local.radius < level.playernoderadius + 1)
  2005.             {
  2006.                 local.newnum = local.i
  2007.                 if (getcvar(playerset) == "1")
  2008.                 {
  2009.                     println ("Local radius is " + local.radius + " and level.playernoderadius is " + level.playernoderadius)
  2010.                     println ("The playernoderadius is " + level.playernoderadius + " and the node was " + level.playernodeset + " at distance " + vector_length ($player.origin - level.friendlynode[level.playernodenum].origin) + " but is now node with set " + level.friendlynode[local.newnum].set + " at distance of " + vector_length ($player.origin - level.friendlynode[local.newnum].origin))
  2011.                 }
  2012.                 level.playernoderadius = local.radius
  2013.             }
  2014.         }
  2015.  
  2016.         waitframe
  2017.     }
  2018.  
  2019. /*
  2020.     for (local.i=1;local.i<level.friendlynodes+1;local.i++)
  2021.     {
  2022.         if (level.time > level.friendlyusedtime[local.i])
  2023.         if (level.friendlyused[local.i] == 1)
  2024.         {
  2025.             if (getcvar(debug) == "1")
  2026.                 print "C"
  2027.  
  2028.             level.friendlyused[local.i] = 0
  2029.             level.friendlyusedtime[local.i] = level.time + level.friendlyusedtimeupdate
  2030.         }
  2031.     }
  2032. */
  2033.     
  2034. end
  2035.  
  2036. playernode_evaluate:
  2037.  
  2038.     level waittill spawn
  2039.  
  2040.     local.newnum = -1
  2041.  
  2042.     while( 1 )
  2043.     {
  2044.         if (getcvar(playerset) == "1")
  2045.             println ("node 1 " + local.newnum)
  2046.  
  2047.         if (level.playernoderadius > 300) // was 600
  2048.             local.newnum = -1
  2049.  
  2050.  
  2051.         if (local.newnum == -1)
  2052.         {
  2053.             local.radi = 50000
  2054.             local.lasti = 10
  2055.             for (local.i=1;local.i<level.friendlynodes+1;local.i++)
  2056.             if (level.friendlyused[local.i] < level.usedrange)
  2057.             {
  2058.                 local.radius = vector_length (level.friendlynode[local.i].origin - $player.origin)
  2059.  
  2060.                 if (local.radius < local.radi)
  2061.                 {
  2062.                     local.radi = local.radius
  2063.                     level.playernoderadius = local.radius
  2064.                     local.newnum = local.i
  2065.                 }
  2066.                 // do lazy evaluation of this behemoth
  2067.                 if ( local.i > local.lasti )
  2068.                 {
  2069.                     local.lasti += 10
  2070.                     waitframe
  2071.                 }
  2072.             }
  2073.         }
  2074.  
  2075.         if (getcvar(playerset) == "1")
  2076.             println ("node 2 " + local.newnum)
  2077.     
  2078.         if ((local.newnum != -1) && (level.friendlynode[local.newnum].set != -1))
  2079.         {
  2080.             if (local.playerheld != -1)
  2081.             if (level.friendlyused[local.newnum] == 0)
  2082.             {
  2083.                 level.friendlyused[local.newnum] = 1
  2084.                 local.playerheld = local.newnum
  2085.             }
  2086.  
  2087.             level.playernodenum = local.newnum
  2088.             level.playernodeset = level.friendlynode[local.newnum].set
  2089.             level.playernoderadius = vector_length (level.friendlynode[level.playernodenum].origin - $player.origin)
  2090.         }
  2091.  
  2092.         if (getcvar(playerset) == "1")
  2093.             println ("node 3 " + local.newnum)
  2094.  
  2095.         if (getcvar(cnode) == "1")
  2096.             println ("Player's distance to his current node is " + level.playernoderadius + " and that node set is " + level.friendlynode[local.newnum].set + " and the node num is " + level.playernodenum)
  2097.  
  2098. //        if (local.num != level.playernodeset)
  2099. //        {
  2100. //            println level.playernodeset
  2101.             local.num = level.playernodeset
  2102. //        }
  2103.     waitframe
  2104.     }
  2105.  
  2106. end
  2107.  
  2108.  
  2109. friendlyinit:
  2110.     self.fnum = -3
  2111.     self.waittime = 0.2
  2112.     self.noticescale = 1
  2113.     self.area = -1
  2114.     self.mins = -20
  2115.     self.maxs = 20
  2116.     self.friendtype = 0
  2117.     self.distance = 250
  2118.     self.destination = $player
  2119.     self.destinationset = 10
  2120.     self.destinationnum = 10
  2121. end
  2122.  
  2123. friendlygen:
  2124.  
  2125.     level.playernodenum = -1
  2126.     level.playernodeset = -1
  2127.  
  2128.     level.friendlyavoid = 1
  2129.  
  2130.     if (level.entref == NIL)
  2131.         level.entref = 0
  2132.  
  2133.     $player.maxhealth = $player.health
  2134.     level.deadent = spawn script_origin
  2135.     level.deadent thread friendlyinit
  2136.  
  2137.     level.medictime = 4 // was 2.5
  2138.  
  2139.     if (getcvar(skill) == "0")
  2140.         level.medicmin = 65
  2141.     else
  2142.     if (getcvar(skill) == "1")
  2143.         level.medicmin = 65
  2144.     else
  2145.     if (getcvar(skill) == "2")
  2146.         level.medicmin = 65
  2147.  
  2148.  
  2149.  
  2150.     if (level.frienddebug == NIL)
  2151.         level.frienddebug = 0
  2152.  
  2153.     level.friendlyusedtimeupdate = 5
  2154.  
  2155.     if ($friendly == NULL)
  2156.         level.friendlys = 0
  2157.         else
  2158.         level.friendlys = $friendly.size
  2159.  
  2160.  
  2161.     if (level.friendlys > 0)
  2162.     {
  2163.         level.friendly = exec global/makearray.scr $friendly
  2164.  
  2165.         for (local.i=1;local.i<level.friendlys+1;local.i++)
  2166.         {
  2167.             if (getcvar(debug) == "1")
  2168.                 println ("friendly gen " + local.i)
  2169.     
  2170.             if (level.friendly[local.i].fnum == NIL)
  2171.                 println ("Warning, friendly at origin " + level.friendly[local.i].origin + "has no #fnum") 1
  2172.                 else
  2173.                 println ("Spawned friendly " + level.friendly[local.i].fnum)
  2174.  
  2175.             
  2176.  
  2177.             
  2178.             level.friendly[local.i].noticescale = 1
  2179.             level.friendly[local.i].waittime = 0.2
  2180.             level.friendly[local.i].area = -1
  2181.             level.friendly[local.i].mins = -5
  2182.             level.friendly[local.i].maxs = 40
  2183.             level.friendly[local.i].friendtype = 0
  2184.             level.friendly[local.i].distance = 250
  2185.             level.friendly[local.i].destinationset = 10
  2186.             level.friendly[local.i].destinationnum = 10
  2187.  
  2188.             if (level.friendly[local.i].fnum)
  2189.                 level.fnum[level.friendly[local.i].fnum] = level.friendly[local.i]
  2190.         
  2191.             if (level.friendly[local.i].fnum == 1)
  2192.                 level.friendly1 = level.friendly[local.i] 
  2193.  
  2194.             if (level.friendly[local.i].fnum == 2)
  2195.                 level.friendly2 = level.friendly[local.i] 
  2196.  
  2197.             if (level.friendly[local.i].fnum == 3)
  2198.                 level.friendly3 = level.friendly[local.i] 
  2199.  
  2200.             if (level.friendly[local.i].fnum == 4)
  2201.                 level.friendly4 = level.friendly[local.i] 
  2202.  
  2203.             if (level.friendly[local.i].fnum == 5)
  2204.                 level.friendly5 = level.friendly[local.i] 
  2205.  
  2206.             if (level.friendly[local.i].fnum == 6)
  2207.                 level.friendly6 = level.friendly[local.i] 
  2208.  
  2209.             if (level.friendly[local.i].fnum == 7)
  2210.                 level.friendly7 = level.friendly[local.i] 
  2211.  
  2212.             if (level.friendly[local.i].fnum == 8)
  2213.                 level.friendly8 = level.friendly[local.i] 
  2214.  
  2215.             if (level.friendly[local.i].fnum == 9)
  2216.                 level.friendly9 = level.friendly[local.i] 
  2217.  
  2218.             if (level.friendly[local.i].fnum == 10)
  2219.                 level.friendly10 = level.friendly[local.i] 
  2220.  
  2221.             if (level.friendly[local.i].fnum == 11)
  2222.                 level.friendly11 = level.friendly[local.i] 
  2223.  
  2224.             if (level.friendly[local.i].fnum == 12)
  2225.                 level.friendly12 = level.friendly[local.i] 
  2226.  
  2227.             level.friendly[local.i] thread friendlydeath
  2228.             
  2229.             if (getcvar(medic) == "1")
  2230.                 level.friendly[local.i] thread soondie
  2231.  
  2232.         }
  2233.     }
  2234.  
  2235.     local.chaincount = 0
  2236. //    for (local.i=1;local.i<$friendlychain.size+1;local.i++)
  2237.     while ($friendlychain.size > 0)
  2238.     {
  2239.  
  2240.         local.ent =    $friendlychain[1]
  2241.         println ("friendlychains left " + $friendlychain.size + " current set " + local.chaincount)
  2242.         if (local.ent.set)
  2243.             local.ent.chain_set = local.ent.set
  2244.         else
  2245.             local.ent.chain_set = -1
  2246.  
  2247.         local.chain_set = local.ent.chain_set
  2248.         local.ent.set = local.chaincount
  2249.         local.ent.targetname = "friendlynode"
  2250.         local.breaker = 0
  2251.         while (local.breaker == 0)
  2252.         {
  2253.             if ((local.ent.target) && ($(local.ent.target)))
  2254.             {
  2255.                 local.newent = local.ent.target
  2256.                 local.chaincount+=10
  2257.                 local.newent.set = local.chaincount
  2258.                 local.newent.chain_set = local.chain_set
  2259.                 local.ent.targetname = "friendlynode"
  2260.                 local.ent = local.newent
  2261.             }
  2262.             else
  2263.             local.breaker = 1
  2264.  
  2265.         }
  2266.         local.chaincount+=500
  2267.     }
  2268.  
  2269.  
  2270.     if ($friendlynode == NULL)
  2271.         level.friendlynodes = 0
  2272.         else
  2273.         level.friendlynodes = $friendlynode.size
  2274.  
  2275.     if (level.friendlynodes > 0)
  2276.     {
  2277.         level.friendlynode = exec global/makearray.scr $friendlynode
  2278.  
  2279.         for (local.i=1;local.i<level.friendlynodes+1;local.i++)
  2280.         {
  2281.             if (level.friendlynode[local.i].setthread)
  2282.                 println ("friendlynode " + local.i + " has setthread " + level.friendlynode[local.i].setthread)
  2283.             else
  2284.                 println ("friendlynode " + local.i + " has no setthread ")
  2285.  
  2286.             level.friendlyused[local.i] = 0
  2287.             level.friendlyusedtime[local.i] = level.time + level.friendlyusedtimeupdate
  2288.  
  2289.             if (level.friendlynode[local.i].area == NIL)
  2290.                 level.friendlynode[local.i].area = -1
  2291.  
  2292.             if (level.enemyarea[level.friendlynode[local.i].area] == NIL)
  2293.                 level.enemyarea[level.friendlynode[local.i].area] = 0
  2294.  
  2295.             level.friendlynode[local.i].nodenum = local.i
  2296.  
  2297.             if (level.friendlynode[local.i].set == NIL)
  2298.             {
  2299.                 println ("Warning, friendlynode at origin " + level.friendlynode[local.i].origin + "has no #set")
  2300.                 level.friendlynode[local.i].set = -1
  2301.             }
  2302.         }
  2303.  
  2304.         println ("Spawned " + level.friendlynodes + " friendlynodes")
  2305.  
  2306.         for (local.i=1;local.i<level.friendlynodes+1;local.i++)
  2307.             local.used[local.i] = 0
  2308.  
  2309.         for (local.count=1;local.count<level.friendlynodes+1;local.count++)
  2310.         {
  2311.             local.num = 50000
  2312.             local.node = -1000
  2313.  
  2314.             for (local.i=1;local.i<level.friendlynodes+1;local.i++)
  2315.             {
  2316.                 if ((level.friendlynode[local.i].set < local.num) && (local.used[local.i] == 0))
  2317.                 {
  2318.                     local.node = local.i
  2319.                     local.num = level.friendlynode[local.i].set
  2320.                 }
  2321.             }
  2322.  
  2323.             if (local.node == -1000)
  2324.                 println ("ERROR No node found  __ " + local.count)
  2325.  
  2326.             level.friendlynodetemp[local.count] = level.friendlynode[local.node]
  2327.             local.used[local.node] = 1
  2328.         }
  2329.  
  2330.         for (local.i=1;local.i<level.friendlynodes+1;local.i++)
  2331.         {
  2332.             level.friendlynode[local.i] = level.friendlynodetemp[local.i]
  2333.             level.friendlynodetemp[local.i] = NIL
  2334.             println ("Set for friendlynode " + local.i + " is " + level.friendlynode[local.i].set)
  2335.         }
  2336.  
  2337.         if (getcvar(medic) != "1")
  2338.         thread playernode
  2339.         thread hudd
  2340.     }
  2341.  
  2342.  
  2343.     if ($enemy == NULL)
  2344.         level.enemys = 0
  2345.         else
  2346.         level.enemys = $enemy.size
  2347.  
  2348.         println ("There are " + level.enemys + " enemies")
  2349.  
  2350.     if (level.enemys > 0)
  2351.     {
  2352.         level.enemy = exec global/makearray.scr $enemy
  2353.  
  2354.         for (local.i=1;local.i<level.enemys+1;local.i++)
  2355.         {
  2356.                 println ("Spawned enemy " + local.i)
  2357.  
  2358.             if (level.enemy[local.i].area == NIL)
  2359.                 level.enemy[local.i].area = -1
  2360.             else
  2361.             {
  2362.                 if (level.enemyarea[level.enemy[local.i].area] == NIL)
  2363.                     level.enemyarea[level.enemy[local.i].area] = 0
  2364.  
  2365.                     level.enemy[local.i] thread areatrigger 1
  2366.             }
  2367.                 
  2368.             if (level.enemy[local.i].group == NIL)
  2369.                 level.enemy[local.i].group = -1
  2370.             else
  2371.             {
  2372.                 if (level.enemyset[level.enemy[local.i].group] == NIL)
  2373.                     level.enemyset[level.enemy[local.i].group] = 0
  2374.  
  2375.                     level.enemy[local.i] thread settrigger
  2376.             }
  2377.                 
  2378.         }
  2379.  
  2380.     }
  2381.  
  2382.     level waittill spawn
  2383.  
  2384.  
  2385. end
  2386.  
  2387. hudd:
  2388.     level waittill spawn
  2389.  
  2390. local.float = 0.5
  2391. local.base = 0.5
  2392.  
  2393.  
  2394.  
  2395.  
  2396.     local.timer = level.time - 1
  2397.  
  2398.     while (1)
  2399.     {
  2400.  
  2401.         if (getcvar(debug) == "1")
  2402.         {
  2403.             if (level.time > local.timer)
  2404.             {
  2405.                 local.timer = level.time + 2
  2406.                 for (local.i=1;local.i<level.friendlys+30;local.i++)
  2407.                     huddraw_alpha (local.i + 100) 0
  2408.  
  2409.                 for (local.i=1; local.i<level.friendlys+1;local.i++)
  2410.                     if ((isalive level.friendly[local.i]) && (level.friendly[local.i].entref == NIL))
  2411.                     {
  2412.                         level.entref++
  2413.                         level.friendly[local.i].entref = "friendly" + level.entref
  2414.                     }
  2415.  
  2416.             }
  2417.  
  2418.  
  2419.             local.y = 210
  2420.             local.y = 160
  2421.  
  2422.             local.base += 0.11
  2423.             if (local.base > 1.5)
  2424.                 local.base = local.base - 1
  2425.  
  2426.             local.add = 0
  2427.  
  2428.             for (local.i=1;local.i<level.friendlys+1;local.i++)
  2429.             {
  2430.                 huddraw_alpha (local.i + 100) 0
  2431.                 if ((isalive level.friendly[local.i]) && (level.friendly[local.i].entref != NIL))
  2432.                 {
  2433.                     local.add += 0.11
  2434.                     local.float = local.base + local.add
  2435.                     
  2436.  
  2437.                     while (local.float > 1.0)
  2438.                         local.float = local.float - 0.5
  2439.  
  2440.                     local.y += 18
  2441.                     huddraw_font (local.i + 100) "verdana-12"
  2442.  
  2443.                     if (level.friendly[local.i].destination)
  2444.                     {
  2445.                         if (level.friendly[local.i].destination.entref)
  2446.                             local.destname = ("F" + level.friendly[local.i].destination.entref)
  2447.                         else
  2448.                         if (level.friendly[local.i].destination == $player)
  2449.                             local.destname = "Player"
  2450.                         else
  2451.                             local.destname = level.friendly[local.i].destination.targetname
  2452.                     }
  2453.                         else
  2454.                             local.destname = "None"
  2455.  
  2456.                     if (level.friendly[local.i].area != -1)
  2457.                         huddraw_string (local.i + 100) (level.friendly[local.i].entref + ":d" + local.destname + ":" + level.friendly[local.i].thinkstate + ":s" + level.friendly[local.i].destinationset + ":f" + level.friendly[local.i].friendtype + ":h" + level.friendly[local.i].health + ":a" + level.friendly[local.i].area + ":" + level.enemyarea[level.friendly[local.i].area])
  2458.                     else
  2459.                         huddraw_string (local.i + 100) (level.friendly[local.i].entref + ":d" + local.destname + ":" + level.friendly[local.i].thinkstate + ":s" + level.friendly[local.i].destinationset + ":f" + level.friendly[local.i].friendtype + ":h" + level.friendly[local.i].health)
  2460.  
  2461.                     huddraw_align (local.i + 100) left top
  2462.                     huddraw_rect (local.i + 100) 0 local.y 0 0
  2463.                     huddraw_alpha (local.i + 100) local.float
  2464.                 }
  2465.             }
  2466.  
  2467.             if ((level.currentfriendlies != NIL) && (level.maxfriendlies != NIL))
  2468.             {
  2469.                 local.p = 98
  2470.                 local.y += 18
  2471.  
  2472.                         huddraw_font (local.p + 100) "verdana-12"
  2473.  
  2474.                         local.string = ((level.currentfriendlies) + "/" + (level.maxfriendlies))
  2475.                         huddraw_string (local.p + 100) local.string
  2476.  
  2477.                         huddraw_align (local.p + 100) left top
  2478.                         huddraw_rect (local.p + 100) 0 local.y 0 0
  2479.                         huddraw_alpha (local.p + 100) local.float
  2480.  
  2481.             }
  2482.  
  2483.  
  2484.             local.i++
  2485.             local.y += 18
  2486.  
  2487.             huddraw_font (local.i + 100) "verdana-12"
  2488.  
  2489.             local.string = ("Playerset: " + level.playernodeset)
  2490.             huddraw_string (local.i + 100) local.string
  2491.  
  2492.             huddraw_align (local.i + 100) left top
  2493.             huddraw_rect (local.i + 100) 0 local.y 0 0
  2494.             huddraw_alpha (local.i + 100) local.float
  2495.  
  2496.  
  2497.             local.i++
  2498.             local.y += 18
  2499.  
  2500.                     huddraw_font (local.i + 100) "verdana-12"
  2501.  
  2502.                     local.string = " "
  2503.                     local.stringcount = 1
  2504.  
  2505.                 for (local.p=1;local.p<level.friendlynodes+1;local.p++)
  2506.                 {
  2507.                     local.stringcount++
  2508.                     if (local.stringcount > 12)
  2509.                     {
  2510.                         local.string = (local.string + "\n")
  2511.                         local.stringcount = 0
  2512.                     }
  2513.  
  2514.                 if (level.friendlyused[local.p] == 0)
  2515.                     local.string = (local.string + "0")
  2516.                     else
  2517.                     local.string = (local.string + level.friendlyused[local.p])
  2518.                 }
  2519.  
  2520.                     huddraw_string (local.i + 100) local.string
  2521.  
  2522.                     huddraw_align (local.i + 100) left top
  2523.                     huddraw_rect (local.i + 100) 0 local.y 0 0
  2524.                     huddraw_alpha (local.i + 100) local.float
  2525.  
  2526.  
  2527.  
  2528.         }
  2529.         wait 1 
  2530.     }
  2531. end
  2532.  
  2533.  
  2534. friendlyused local.num:
  2535.  
  2536.     if ((level.friendlyused[local.num] == 0) || (level.friendlyused[local.num] == 1))
  2537.     {
  2538.         level.friendlyused[local.num] = 1
  2539.         level.friendlyusedtime[local.num] = level.time + level.friendlyusedtimeupdate
  2540.     }
  2541.  
  2542. end
  2543.  
  2544.  
  2545. settrigger:
  2546.     level waittill spawn
  2547.     level.enemyset[self.group]++
  2548.  
  2549.     self waittill death
  2550.  
  2551.     level.enemyset[self.group]--
  2552.     println ("*******set**** " + level.enemyset[self.group] + " left in " + self.group)
  2553.  
  2554.     if (level.enemyset[self.group] < 1)
  2555.         thread level.script::("enemythread" + self.group)
  2556.     
  2557. end
  2558.  
  2559.  
  2560.  
  2561. areatrigger local.waitspawn:
  2562. //    println ("localwaitspawn is " + local.waitspawn)
  2563.     if (local.waitspawn != NIL)
  2564.         level waittill spawn
  2565.  
  2566.     if (level.friendlynodes == NIL)
  2567.         end
  2568.  
  2569. //    println ("health is " + self.health)
  2570.     
  2571.     level.enemyarea[self.area]++
  2572.  
  2573.     if (getcvar(debug) == "1")
  2574.         println ("Areatrigger " + self.area + " has " + level.enemyarea[self.area] + " enemies in it")
  2575.  
  2576.     for (local.i=1;local.i<level.friendlynodes+1;local.i++)
  2577.     {
  2578.         if (level.friendlynode[local.i].area == self.area)
  2579.             level.friendlyused[local.i] = 0
  2580.     }
  2581.  
  2582. //    println ("self is " + self.targetname + " and self area is " + self.area)
  2583.  
  2584.     self waittill death
  2585. //    println self.health
  2586.  
  2587.     level.enemyarea[self.area]--
  2588.     println ("*******area**** " + level.enemyarea[self.area] + " left in " + self.area)
  2589.  
  2590.     if (level.enemyarea[self.area] < 1)
  2591.     {
  2592.         for (local.i=1;local.i<level.friendlynodes+1;local.i++)
  2593.         {
  2594.             if (level.friendlynode[local.i].area == self.area)
  2595.                 level.friendlyused[local.i] = -1
  2596.         }
  2597.     }
  2598.  
  2599.     
  2600. end
  2601.  
  2602. friendlydeath:
  2603.     level waittill spawn
  2604.     self waittill death
  2605.     for (local.i=1;local.i<level.friendlys+1;local.i++)
  2606.         if (level.friendly[local.i] == self)
  2607.             level.friendly[local.i] = level.deadent
  2608.  
  2609. end
  2610.  
  2611.  
  2612. /*
  2613.  
  2614.                     if (vector_length(self.origin - self.destination.origin) > self.distance + local.friendrange)
  2615.                     {
  2616.                         self runto self.destination
  2617.                         local.runtime = level.time + 2
  2618.  
  2619.                         while ((vector_length (self.origin - self.destination.origin) > self.distance - local.friendrange))
  2620.                             wait self.waittime
  2621.  
  2622. //                        if (parm.movedone != 1)
  2623. //                            println (self + " did not get to " + self.destination.set)
  2624.                     }
  2625.  
  2626.  
  2627.                     if (vector_length (self.destination.origin - self.origin) > self.distance + local.friendrange) 
  2628.                     {
  2629.                         self runto self.destination.origin
  2630.                         if (self.waittime == -1)
  2631.                             waitframe
  2632.                         else
  2633.                             wait self.waittime
  2634.  
  2635.  
  2636.                     }
  2637.                     else
  2638.                     if (vector_length (self.destination.origin - self.origin) < self.distance) 
  2639.                     {
  2640.                         local.standtime = level.time + 0.1
  2641.                         if (local.stood == 0)
  2642.                         {
  2643.                             self exec global/stand.scr
  2644.                             local.stood = 1
  2645.                         }
  2646.  
  2647.                         if (self.waittime == -1)
  2648.                             waitframe
  2649.                         else
  2650.                             wait self.waittime
  2651.  
  2652.  
  2653.                     }
  2654. */
  2655.             /*
  2656.         
  2657.                 if (level.frienddebug == 1)
  2658.                 if (level.time > local.runtime)
  2659.                 {
  2660.                     local.runtime = level.time + 2
  2661.                     print ("dist: " + self.distance + "     ")
  2662.                     if (self.destination == $player)
  2663.                     println (self + "/" + self.fnum + " is supposed to run to " + self.destination)
  2664.                     else
  2665.                     println (self + "/" + self.fnum + " is supposed to run to " + self.destination + "/" + self.destination.fnum)
  2666.  
  2667.                 }
  2668.  
  2669.                 if !(isalive self.destination)
  2670.                 {
  2671.                     if (self.area != -1)
  2672.                     {
  2673.                         self.friendtype = self.areapast
  2674.                     }
  2675.                     else
  2676.                     {
  2677.                         if ((self.destination.destination != NIL) && (isalive self.destination.destination))
  2678.                             self.destination = self.destination.destination
  2679.                         else
  2680.                             self.destination = $player
  2681.                     }
  2682.                 }
  2683.  
  2684.                 if (self.destination != $player)
  2685.                 for (local.i=1;local.i<level.friendlys+1;local.i++)
  2686.                 {
  2687.                     if (isalive level.friendly[local.i])
  2688.                     {
  2689.                         if (((self.area == -1) && (level.friendly[local.i].area != -1)) || ((level.friendly[local.i].destination == self.destination) && (self != level.friendly[local.i])))
  2690.                             self.destination = level.friendly[local.i]
  2691.                     }
  2692.                 }
  2693.  
  2694.                 if (level.time > local.standtime)
  2695.                 {
  2696.                     local.destination = self.destination
  2697.                     local.tempnum = 0
  2698.                     while ((isalive local.destination.destination) && (self.destination != $player) && (local.tempnum < 10))
  2699.                     {
  2700.                         local.tempnum++
  2701.                         if (local.destination == self)
  2702.                             self.destination = $player
  2703.  
  2704.                             local.destination = local.destination.destination
  2705.                     }
  2706.  
  2707.                     if (vector_length (self.destination.origin - self.origin) > self.distance + local.friendrange) 
  2708.                     {
  2709.                         local.runtime = level.time + 5
  2710.                         self runto self.destination.origin
  2711.                         if (self.waittime == -1)
  2712.                             waitframe
  2713.                         else
  2714.                             wait self.waittime
  2715.                     }
  2716.                     else
  2717.                     if (vector_length (self.destination.origin - self.origin) < self.distance) 
  2718.                     {
  2719.                         local.standtime = level.time + 2
  2720.     //                    self runto self
  2721.                         self exec global/stand.scr
  2722.                         if (self.waittime == -1)
  2723.                             waitframe
  2724.                         else
  2725.                             wait self.waittime
  2726.                     }
  2727.                 }
  2728.  
  2729.                     thread repulse
  2730.  
  2731.             }
  2732.             */
  2733.  
  2734.     /*
  2735.                 if (level.time > local.runtime)
  2736.                 {
  2737.                     local.entarray = -1
  2738.                     local.entarrayentree = 0
  2739.                     
  2740.                     local.setnum = -1
  2741.                     local.nodenum = -1
  2742.  
  2743.                     if ((self.destinationset < level.playernodeset + self.mins) || (self.destinationset > level.playernodeset + self.maxs))
  2744.                     {
  2745.                         
  2746.                         for (local.i=1;local.i<level.friendlynodes+1;local.i++)
  2747.                         {
  2748.                             if (self.destination.set == NIL)
  2749.                                 self.destination = level.friendlynode[1]
  2750.  
  2751.                             if ((level.friendlynode[local.i].set > self.destinationset) && (local.setnum < level.friendlynode[local.i].set) && ((level.friendlynode[local.i].set > level.playernodeset + self.mins) && (level.friendlynode[local.i].set < level.playernodeset + self.maxs) && (level.friendlyused[local.i] == 0)) && (self.lastdestination != level.friendlynode[local.i]) && (self.destinationset != level.friendlynode[local.i].set))
  2752.                             {
  2753.                                     local.setnum = level.friendlynode[local.i].set
  2754.                                     local.nodenum = local.i
  2755.  
  2756.                                 if (local.nodenum != -1)
  2757.                                 {
  2758.  
  2759.                                     if (level.friendlyused[self.destinationnum] == 1)
  2760.                                         level.friendlyused[self.destinationnum] = 0
  2761.  
  2762.                                     self.destinationnum = local.nodenum
  2763.                                     thread friendlyused self.destinationnum
  2764.                                     self.destination = level.friendlynode[local.nodenum]
  2765.                                     self.destinationset = level.friendlynode[local.nodenum].set
  2766.                                 }
  2767.                             }
  2768.                         }
  2769.                     }
  2770.  
  2771.                     if (vector_length(self.origin - self.destination.origin) > self.distance + local.friendrange)
  2772.                     {
  2773.                         self thread ailook0
  2774.  
  2775.  
  2776.                         self runto self.destination
  2777.                         local.runtime = level.time + 2
  2778.  
  2779.                         while ((vector_length (self.origin - self.destination.origin) > self.distance - local.friendrange) && (level.playernodeset > self.destinationset + self.mins) && (level.playernodeset < self.destinationset + self.maxs))
  2780.                             wait self.waittime
  2781.  
  2782.             
  2783.                         self.lookthread delete
  2784.                     }
  2785.                     else
  2786.                     {
  2787.                         wait 1
  2788.                         thread friendlyused self.destinationnum
  2789.                     }
  2790.  
  2791.                     self.lastdestination = self.destination
  2792.                 }
  2793.  
  2794.     */
  2795. /*
  2796.  
  2797.     self runto such&such
  2798.     self waittill move
  2799.     if (parm.movefail != 1)
  2800.         self waittill movedone
  2801.         else
  2802. */
  2803.  
  2804. testprint local.o:
  2805.     local.t = level.time + 4
  2806.     while (local.t > level.time)
  2807.     {
  2808.         print3d local.o 2 "000"
  2809.         waitframe
  2810.     }
  2811. end
  2812.  
  2813. nicetrace local.start local.dest:
  2814.  
  2815.     if (local.start != $player)
  2816.     {
  2817.         if (local.start cansee local.dest 360)
  2818.             end 1
  2819.  
  2820.         if (local.dest cansee local.start 360)
  2821.             end 1
  2822.     }
  2823.  
  2824.     if (local.start canseenoents local.dest)
  2825.         end 1
  2826.  
  2827.     if (local.start canseenoents local.dest.origin)
  2828.         end 1
  2829.  
  2830.     if (local.start canseenoents (local.dest.origin + (0 0 35)))
  2831.         end 1
  2832.  
  2833.     if (local.start canseenoents (local.dest.origin + (0 0 70)))
  2834.         end 1
  2835.  
  2836. end -1
  2837.  
  2838.  
  2839. lookpast local.see:
  2840.     local.vect = (local.see.origin - self.origin)
  2841.     local.vect = vector_normalize (local.vect)
  2842.  
  2843. //    local.dist = vector_length (self.origin - local.dest.origin)
  2844.     
  2845.     local.vect[0] =     local.vect[0] * (40)
  2846.     local.vect[1] =     local.vect[1] * (40)
  2847.     local.vect[2] =     local.vect[2] * (40)
  2848.  
  2849. //    local.o = (self.origin - local.see.origin) + local.see.origin
  2850.     local.vect = local.see.origin + local.vect
  2851.     self lookat local.vect
  2852. //    thread testprint local.vect
  2853.  
  2854. end
  2855.  
  2856. lookpastlow local.see local.delay:
  2857.     if (local.delay != NIL)
  2858.         wait local.delay
  2859.     local.vect = ((local.see.origin + (0 0 70)) - self.origin)
  2860.     local.vect = vector_normalize (local.vect)
  2861.  
  2862. //    local.dist = vector_length (self.origin - local.dest.origin)
  2863.     
  2864.     local.vect[0] =     local.vect[0] * (40)
  2865.     local.vect[1] =     local.vect[1] * (40)
  2866.     local.vect[2] =     local.vect[2] * (40)
  2867.  
  2868.     local.vect = (local.see.origin + (0 0 70)) + local.vect
  2869.     self lookat local.vect
  2870. //    thread testprint local.vect
  2871. end
  2872.  
  2873. chain_off local.set:
  2874.     for (local.i=1;local.i<level.friendlynodes+1;local.i++)
  2875.     if ((level.friendlynode[local.i].chain_set) && (level.friendlynode[local.i].chain_set == local.set))
  2876.         level.friendlyused[local.i] = 1
  2877. end
  2878.  
  2879. chain_on local.set:
  2880.     for (local.i=1;local.i<level.friendlynodes+1;local.i++)
  2881.     if ((level.friendlynode[local.i].chain_set) && (level.friendlynode[local.i].chain_set == local.set))
  2882.         level.friendlyused[local.i] = 0
  2883. end
  2884.  
  2885. chain_all_on local.set:
  2886.     for (local.i=1;local.i<level.friendlynodes+1;local.i++)
  2887.     if (level.friendlynode[local.i].chain_set)
  2888.         level.friendlyused[local.i] = 0
  2889. end
  2890.  
  2891. chain_all_off local.set:
  2892.     for (local.i=1;local.i<level.friendlynodes+1;local.i++)
  2893.     if (level.friendlynode[local.i].chain_set)
  2894.         level.friendlyused[local.i] = 1
  2895. end
  2896.  
  2897. // I'm testing
  2898.